我正在尝试在远程服务器上以 root 身份运行命令(通过 sudo),并将标准输出(但不是标准错误)捕获到文件中。
例如。像这样的东西:
ssh user@remote "cat /root/file.tar | gzip" > root-file.tar.gz
除非我需要在远程上获得 root 权限:
ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
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
我添加了-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:
我在 sudoers 中使用 NOPASSWD 将特定命令列入白名单,这对于定期出现的脚本非常有效,但我发现我想偶尔使用不同的任意命令执行此类操作,因此我不能永远添加 NOPASSWD。
答案1
您可以将 -S 选项[0] 传递给 sudo,这样它就可以接受来自 stdin 的密码,而不需要 tty。
这可能会导致您的密码回显到终端,因此请尝试自行关闭回显:
$ stty -echo; ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
[sudo] password for user:
$
[0] 来自联机帮助页:-S(stdin)选项使 sudo 从标准输入而不是终端设备读取密码。密码后面必须跟有换行符。