我正在尝试在远程服务器上以 root 身份(通过 sudo)运行命令,并将 stdout(但不是 stderr)捕获到文件中。
例如。像这样的东西:
ssh user@remote "cat /root/file.tar | gzip" > root-file.tar.gz
Run Code Online (Sandbox Code Playgroud)
除非我需要在遥控器上成为 root:
ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
Run Code Online (Sandbox Code Playgroud)
root 没有密码,无法以身份登录,所以我不能使用su
或ssh root@server
。
当我尝试上述命令时,我得到:
$ ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)
我添加-t
以便 ssh 分配一个 tty,然后root-file.tar.gz
从 sudo(和 gzip,但我可以 --force)获取输出,所以我猜它正在将远程 stdout 和 stderr 捕获到本地 stdout 中:
$ ssh -t user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
(hangs)
$ cat root-file.tar.gz
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
[sudo] password for user:
Run Code Online (Sandbox Code Playgroud)
我已经在 sudoers 中使用 NOPASSWD 将特定命令列入白名单,这对于经常出现的脚本很有效,但我发现我想偶尔使用不同的任意命令执行此类操作,因此我不能永远添加 NOPASSWD。
您可以将 -S 选项[0] 传递给 sudo,这样它就可以接受来自 stdin 的密码,而不需要 tty。
\n\n这可能会导致您的密码回显到终端,因此请尝试自行关闭回显:
\n\n$ stty -echo; ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz\n[sudo] password for user:\n$\n
Run Code Online (Sandbox Code Playgroud)\n\n[0] 从联机帮助页中: \xe2\x80\x91S (stdin) 选项导致 sudo 从标准输入而不是终端设备读取密码。密码后必须跟有换行符。
\n 归档时间: |
|
查看次数: |
2078 次 |
最近记录: |