将 sudo 与 ssh 命令结合使用并捕获标准输出

将 sudo 与 ssh 命令结合使用并捕获标准输出

我正在尝试在远程服务器上以 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 没有密码,无法登录,所以我无法使用sussh root@server

当我尝试上面的命令时,我得到:

$ ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
sudo: no tty present and no askpass program specified

我添加了-tssh 分配一个 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 从标准输入而不是终端设备读取密码。密码后面必须跟有换行符。

相关内容