我有一个脚本,它使用sudo在远程服务器上通过SSH运行另一个脚本。但是,当我输入密码时,它会显示在终端上。 (否则它工作正常)
ssh user@server "sudo script"
这样做的正确方法是什么,所以我可以通过SSH键入sudo的密码而不输入密码?
答案 0 :(得分:209)
另一种方法是使用-t
切换到ssh
:
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.
答案 1 :(得分:9)
我可以使用以下命令将其完全自动化:
echo pass | ssh -tt user@server "sudo script"
优势:
答案 2 :(得分:6)
假设您不想要密码提示:
ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
实施例
ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
答案 3 :(得分:2)
通过SSH的Sudo传递密码,不需要tty:
您可以在ssh上使用sudo,而不必强迫ssh拥有伪tty(无需使用ssh“ -t”开关),方法是告诉sudo不需要交互式密码,而只需从stdin中获取密码即可。您可以通过使用sudo上的“ -S”开关来执行此操作。这使sudo在stdin上监听密码,并在看到换行符时停止监听。
示例1-简单的远程命令
在此示例中,我们发送了一个简单的whoami
命令:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
我们要告诉sudo不要发出提示,并从stdin中获取其输入。这使sudo密码传递完全安静,因此您返回的唯一响应是whoami
的输出。
此技术的优点是允许您通过sudo而不是ssh本身需要stdin输入来运行程序。这是因为sudo在stdin的第一行上使用了密码,然后让它运行的任何程序继续获取stdin。
示例2-需要自己的stdin的远程命令
在下面的示例中,远程命令“ 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
输出表明<remote_sudo_password>
行已被sudo占用,并且远程执行的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
如果要将整个内容放在脚本中,则无需将密码放在单独的文件中,因为脚本的内容不会出现在您的历史记录中。但是,如果您希望允许不应该看到密码的用户执行脚本,它仍然可能有用。
答案 4 :(得分:0)
NOPASS
是解决方案。继续阅读http://maestric.com/doc/unix/ubuntu_sudo_without_password
答案 5 :(得分:0)
最好的方法是ssh -t user@server "sudo <scriptname>"
,例如ssh -t user@server "sudo reboot"
。
它将首先提示用户输入密码然后提供root用户密码(因为我们正在运行具有root权限的脚本或命令。
我希望它能够帮助你并解决你的疑问。
答案 6 :(得分:0)
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost
echo \"$varCommand\" | sudo bash
答案 7 :(得分:0)
确认@ofirule 的回答很有魅力。
我什至尝试使用 sshpass
并且它有效。这是如何在 sshpass 中使用它:
echo $pass | sshpass -p $pass ssh -tt cloud_user@$ip "sudo su -"
你会发现自己直接在 root shell 中
答案 8 :(得分:-1)
我遇到了一个问题,
user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt
Output:
sudo: no tty present and no askpass program specified
然后我尝试了
#1
vim /etc/sudoers
Defaults:user1 !requiretty
没有工作
#2
user1 ALL=(user2) NOPASSWD: ALL
工作正常!
答案 9 :(得分:-5)
根据您的使用情况,我获得了以下成功:
ssh root@server "script"
这将提示输入root密码,然后正确执行命令。