如何在不覆盖 TTY 的情况下将密码传递给 su/sudo/ssh?

我正在编写一个 C Shell 程序,它将执行 susudossh。它们都希望在控制台输入(TTY)中输入密码,而不是在 stdin 或命令行中输入密码。

有人知道怎么解决吗?

不能设置无密码 sudo

可以是一个选项,但是在我精简的系统中没有。

376520 次浏览

看看 expect linux 实用程序。

它允许你基于 stdin 上的简单模式匹配将输出发送到 stdio。

这个问题的通常解决方案是设置一个助手应用程序,它执行需要超级用户访问的任务: Http://en.wikipedia.org/wiki/setuid

Sudo 不能脱机使用。

稍后编辑: SSH 可以与公私密钥认证一起使用。如果私钥没有密码短语,则可以在不提示输入密码的情况下使用 ssh。

您可以提供密码作为期望脚本的参数。

设置 SSH 为公共密钥认证,密钥上没有密码。网上有很多导游。那你就不需要密码登录了。然后,可以根据客户端主机名限制对密钥的连接。提供合理的安全性,非常适合自动登录。

我编写了一些 Applecript,它通过对话框提示输入密码,然后构建一个自定义 bash 命令,如下所示:

echo <password> | sudo -S <command>

我不知道这是否有帮助。

如果 sudo 接受一个预加密的密码就好了,这样我就可以在我的脚本中对它进行加密,而不用担心附带清晰的文本密码。然而,这对我和我的情况有效。

su -c "Command" < "Password"

希望对你有帮助。

echo <password> | su -c <command> <user>

起作用了。

对于 sudo,有一个-S 选项用于接受来自标准输入的密码:

    -S          The -S (stdin) option causes sudo to read the password from
the standard input instead of the terminal device.

这将允许您运行以下命令:

echo myPassword | sudo -S ls /tmp

至于 ssh,我曾多次尝试自动化/脚本化它的使用,但都没有成功。似乎没有任何内置方法可以在不提示的情况下将密码传递到命令中。正如其他人所提到的,“ 期待”实用程序似乎旨在解决这个难题,但最终,设置正确的私钥授权是尝试自动化这个过程的正确方法。

我有:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

我没问题。

如果没有更好的选择(如其他人所建议的) ,那么 man socat 可以提供帮助:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
socat - EXEC:'ssh -l user server',pty,setsid,ctty


EXEC’utes an ssh session to server. Uses a pty for communication
between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
and makes this pty the owner of a new process group (setsid), so
ssh accepts the password from socat.

所有的 pty、 setsid 和 ctty 复杂性都是必需的,虽然您可能不需要睡眠那么长时间,但是您需要睡眠。Echo = 0选项也值得一看,在 ssh 的命令行上传递远程命令也是如此。

对于 ssh你可以使用 sshpass: sshpass -p yourpassphrase ssh user@host

您只需要首先下载 sshpass:)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

也许你可以使用 expect命令? :

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

该命令自动提供密码。

这可以通过在要连接到的目标主机上设置公钥/私钥来完成。 第一步是为在本地主机上运行脚本的用户生成一个 ssh 密钥,方法是执行:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

然后输入一个空白密码。然后,将 ssh 密钥复制到要连接的目标主机上。

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

在注册了 ssh 密钥之后,就可以从本地主机执行静默 ssh remote_user@other_host了。

一种方法是使用 read-s 选项。.这样密码字符就不会回显到屏幕上。我为一些用例编写了一个小脚本,你可以在我的博客中看到: Http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/

我有同样的问题。对话框脚本创建远程电脑上的目录。 使用 ssh 对话框很简单,我使用 sshpass (以前安装过)。

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip


IP=$(cat /tmp/ip)




dialog --inputbox "Please enter username" 8 78 2> /tmp/user


US=$(cat /tmp/user)




dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass


PASSWORD = $(cat /tmp/pass)




sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER




rm /tmp/ip


rm /tmp/user


rm /tmp/pass

来自德国的问候

Titus

对于 sudo,你也可以这样做:

sudo -S <<< "password" command
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

使用方法:

echo password | sudo command

例如:

echo password | sudo apt-get update; whoami

希望对你有帮助。

基于@Jahid 的回答,我在 macOS 10.13上做到了:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

一个更好的 sshpass替代品是: passh Https://github.com/clarkwang/passh

登录到远程服务器

 $ passh -p password ssh user@host

在远程服务器上运行命令

 $ passh -p password ssh user@host date

传递密码的其他方法

- p 密码(默认为“ password”)

- p env: 从 env var 读取密码

- p file: 从 file 中读取密码

这里我解释了为什么它比 sshpass 更好,以及其他解决方案。

您还可以按照以下方式传递各种参数:

echo password | echo y | sudo -S pacman -Syu

(虽然这是个坏主意,但这只是个例子)

我曾经有过一个用例,需要在同一个命令中运行 Sudo 和 ssh,而不需要 stdin指定所有需要的变量。

这是我用的命令

echo sudopassword | sudo -S -u username sshpass -p  extsshpassword ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  username@ipaddress " CMD on external machine"

把这个命令撕成碎片!

这将允许您使用 Superuser 在计算机上运行命令:

echo password | sudo -S -u username

这将允许您在外部机器上传递 ssh 密码和执行命令:

sshpass -p  sshpassword  ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  username@ipaddress " CMD on external machine"

确保在机器上安装了 sudo 和 openssh 包。