sush over ssh的正确方法

时间:2012-04-25 06:15:58

标签: ssh sudo

我有一个脚本,它使用sudo在远程服务器上通过SSH运行另一个脚本。但是,当我输入密码时,它会显示在终端上。 (否则它工作正常)

ssh user@server "sudo script"

这样做的正确方法是什么,所以我可以通过SSH键入sudo的密码而不输入密码?

10 个答案:

答案 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"

优势:

  • 没有密码提示
  • 不会在远程计算机bash历史记录中显示密码

答案 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密码,然后正确执行命令。