sudo
运行另一个脚本。然而,当我输入密码时,它会显示在终端上。除此之外,它运行得很正常。ssh user@server "sudo script"
怎样才能在通过SSH输入密码时,使得密码不会在我输入的过程中显示出来,这样才是正确的做法?
-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;"
编辑:显然重要的是将命令作为参数提供,而不是通过标准输入(这在事后看起来很有意义)。 - lmat - Reinstate Monica我可以用以下命令完全自动化它:
echo pass | ssh -tt user@server "sudo script"
优点:
关于安全性:正如Kurt所说,运行此命令将在您的本地bash历史记录中显示您的密码,最好将密码保存在不同的文件中或将所有命令保存在 .sh 文件中并执行它。注意:文件需要具有正确的权限,以便只有允许的用户可以访问它。
-t
的用法,但我没有仔细阅读手册,以至于没看到可以通过两次传递来使用它! 这就是我寻找了数月的内容! 作为安全性的增加,我只需在运行 read -s -p "Password: " pw
前设置一个密码变量,然后执行 echo "$pw" | ....
。现在我已经将这个脚本整合成一个方便的程序 :)。 - kaelHISTCONTROL
设置为ignorespace
或ignoreboth
(假设使用bash,其他shell类似),可以通过在命令前加一个空格来轻松避免本地历史记录。另一个安全问题是密码可能会显示在进程表中。 echo
通常是shell内置的,因此它可能是OK,但我更愿意使用_here-string_:<<<pass
。 - Robin A. Meade在SSH中使用Sudo传递密码,无需tty:
您可以告诉sudo不要要求交互式密码验证并只从stdin获取密码,以此来在ssh中使用sudo而无需强制ssh具有伪终端(不使用ssh的“-t”开关)。这可以通过在sudo上使用“-S”开关来实现。这使得sudo监听stdin上的密码,并在看到换行符时停止监听。
示例1 - 简单远程命令
在此示例中,我们发送一个简单的whoami
命令:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
whoami
的输出。$ 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随后会显示额外的行。#!/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
如果你将整个脚本放在一个脚本中,则将密码放在单独的文件中是不必要的,因为脚本的内容不会出现在你的历史记录中。然而,如果你想允许不应该看到密码的用户执行脚本,那么将密码放在单独的文件中仍然可能有用。
假设您不想要密码提示:
ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
例子
ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
export PASSWORD=secret
。只需确保在退出会话后不要让环境变量挂起即可。 - Legogrisexport
命令,以避免任何重要的令牌或秘密被记录在那里。 - theist最好的方法是ssh -t user@server "sudo <scriptname>"
,例如:ssh -t user@server "sudo reboot"
。它首先会提示用户输入密码,然后再提示root用户输入密码(因为我们正在使用root权限运行脚本或命令)。
希望这能帮助你并解决你的疑问。
确认 @ofirule 的答案非常有效。
我甚至尝试了使用 sshpass
,它也可以工作。以下是如何使用 sshpass:
echo $pass | sshpass -p $pass ssh -tt cloud_user@$ip "sudo su -"
你将直接进入根Shell
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
ssh <user@server> sudo <script>
的操作时,它没有起作用,因为我收到了sudo:no tty present and no askpass program specified
的错误提示。 - knocte