我有一个脚本,使用sudo通过SSH在远程服务器上运行另一个脚本。但是,当我键入密码时,它会显示在终端上。(否则它可以正常工作)
ssh user@server "sudo script"
要想通过SSH输入sudo的密码而不会在输入时出现密码,正确的方法是什么?
发布于 2012-04-25 17:18:26
另一种方法是对ssh
使用-t
开关
ssh -t user@server "sudo script"
请参阅man ssh
-t Force pseudo-tty allocation. This can be used to execute arbi-
trary screen-based programs on a remote machine, which can be
very useful, e.g., when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
发布于 2018-11-07 20:25:53
我可以使用以下命令将其完全自动化:
echo pass | ssh -tt user@server "sudo script"
优势:
关于安全性:正如Kurt所说,运行此命令将在本地bash历史记录中显示您的密码,最好将密码保存在另一个文件中,或者将命令保存在一个.sh文件中并执行它。注意:文件需要具有正确的权限,以便只有被允许的用户才能访问它。
发布于 2018-11-19 10:18:15
通过SSH传递密码的Sudo,不需要tty:
您可以在ssh上使用sudo,而不强制ssh使用伪tty(不使用ssh "-t“开关),方法是告诉sudo不需要交互密码,只需要从标准输入中获取密码。您可以通过在sudo上使用"-S“开关来完成此操作。这使sudo侦听stdin上的密码,并在看到换行符时停止侦听。
示例1-简单的远程命令
在这个例子中,我们发送一个简单的whoami
命令:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
我们告诉sudo不要发出提示符,并从stdin获取其输入。这使得传递sudo密码的过程完全静默,因此您得到的唯一响应是whoami
的输出。
这种技术的好处是允许您通过ssh上的sudo运行程序,而这些程序本身需要stdin输入。这是因为sudo通过stdin的第一行使用密码,然后让它运行的任何程序继续获取stdin。
示例2-需要自己的标准输入的远程命令
在下面的示例中,远程命令" cat“通过sudo执行,我们通过stdin提供了一些额外的行,以便显示远程cat。
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
输出表明sudo正在使用<remote_sudo_password>
行,然后远程执行的cat将显示额外的行。
例如,如果您希望使用ssh将密码传递给特权命令,而不使用命令行,这将是有益的示例。比方说,如果您想通过ssh挂载一个远程加密容器。
示例3-挂载远程VeraCrypt容器
在这个示例脚本中,我们通过sudo远程挂载一个VeraCrypt容器,而不需要任何额外的提示文本:
#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
应该注意,在上面的所有命令行示例中(脚本除外),命令行上的<< EOF
构造将导致键入的所有内容(包括密码)都记录在本地计算机的.bash_history中。因此,对于实际使用,强烈建议您使用完全通过脚本执行此操作,如上面的veracrypt示例,或者,如果是在命令行上,则将密码放入文件中并通过ssh重定向该文件。
示例1a -不带本地命令行密码的示例1
因此,第一个示例将变为:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
示例2a -不带本地命令行口令的示例2
第二个示例将变成:
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
如果您将整个内容放在一个脚本中,则不必将密码放在一个单独的文件中,因为脚本的内容不会在您的历史记录中结束。但是,如果您希望允许不应该看到密码的用户执行该脚本,它可能仍然很有用。
https://stackoverflow.com/questions/10310299
复制相似问题