Answers:
另一种方法是使用-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.
ssh -t localhost <<< "sudo touch file;"
编辑显然,将命令作为参数而不是通过标准输入提供是很重要的(事后看来很有意义)。
-t
方法还将显示正常情况下命令的彩色输出。
我可以使用以下命令将其完全自动化:
echo pass | ssh -tt user@server "sudo script"
优点:
关于安全性:正如Kurt所说,运行此命令将在本地bash历史记录中显示您的密码,最好将密码保存在其他文件中或将all命令保存在.sh文件中并执行。注意:该文件需要具有正确的权限,以便只有允许的用户才能访问它。
-t
,但是我没有足够仔细地阅读该手册,以至于您可以通过两次!这就是我几个月以来一直在寻找的东西!为了增加安全性,我只需在与一起运行之前设置一个密码变量read -s -p "Password: " pw
,然后再进行操作即可echo "$pw" | ....
。我现在将其自己打包成一个方便的脚本:)。
假设您不希望输入密码提示:
ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
例
ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
通过SSH的Sudo传递密码,不需要tty:
您可以通过告诉sudo不需要交互式密码,而只需从stdin获取密码,而无需通过ssh在ssh上使用sudo而不强制ssh具有伪tty(不使用ssh“ -t”开关)。您可以通过使用sudo上的“ -S”开关来执行此操作。这使sudo侦听stdin上的密码,并在看到换行符时停止侦听。
示例1-简单的远程命令
在此示例中,我们发送一个简单的whoami
命令:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
我们告诉sudo不要发出提示,而要从stdin接受输入。这使sudo密码传递完全安静,因此您返回的唯一响应是的输出whoami
。
这种技术的优点是允许您通过ssh本身需要stdin输入的sudo上的sudo运行程序。这是因为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
如果要将整个内容放在脚本中,则无需将密码放在单独的文件中,因为脚本的内容不会出现在您的历史记录中。但是,如果您希望允许那些不应该看到密码的用户执行脚本,它仍然很有用。
cat
并将结果通过管道传输到sudo中?您可以仅用sudo
作ssh的主要远程命令吗?
cat
用于将用户密码通过管道传递到另一侧的sudo。如果用户可以在没有密码的情况下运行sudo,则不是必需的,但我不建议这种配置。用管道传输的原因是为了防止密码显示在远程系统的命令行上。命令行不安全,任何用户都可以使用来查看每个命令行ps auxwww
。
cat
在ssh命令中要求cat \| sudo --prompt="" -S...
。如果-S
强行sudo
从stdin读取密码,那么猫和烟斗根本没有必要吗?ssh命令可以简单sudo --prompt="" -S...
吗?
NOPASS
解决方案是在目标计算机上进行配置。继续阅读http://maestric.com/doc/unix/ubuntu_sudo_without_password
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost
echo \"$varCommand\" | sudo bash
我遇到了一个问题
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
正常工作!
根据您的使用情况,我在以下方面取得了成功:
ssh root@server "script"
这将提示您输入root密码,然后正确执行命令。
ssh <user@server> sudo <script>
,因为我遇到了错误sudo: no tty present and no askpass program specified