152

我正在编写一个将执行suor sudoor的 C Shell 程序ssh。他们都希望在控制台输入(TTY)而不是标准输入或命令行中输入密码。

有人知道解决方案吗?

设置无密码sudo不是一种选择。

可能是一个选项,但它不存在于我的精简系统中。

4

22 回答 22

226

对于 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,我已经做了很多尝试来自动化/脚本化它的使用,但没有成功。似乎没有任何内置方法可以在不提示的情况下将密码传递给命令。正如其他人所提到的,“ expect ”实用程序似乎旨在解决这一难题,但最终,设置正确的私钥授权是尝试自动化此操作的正确方法。

于 2010-12-01T17:27:26.380 回答
37

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

echo <password> | sudo -S <command>

我不确定这是否有帮助。

如果 sudo 接受预加密的密码,那就太好了,这样我就可以在我的脚本中对其进行加密,而不必担心回显明文密码。然而,这适用于我和我的情况。

于 2008-12-09T06:04:04.073 回答
31

因为ssh你可以使用sshpass: sshpass -p yourpassphrase ssh user@host

你只需要先下载 sshpass :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
于 2012-01-13T12:27:10.887 回答
14

对于 sudo 你也可以这样做:

sudo -S <<< "password" command
于 2015-06-09T14:12:18.673 回答
12

我有:

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

为我工作。

于 2011-01-07T16:36:04.900 回答
11

这个问题的通常解决方案是设置一个帮助应用程序来执行需要超级用户访问权限的任务: http ://en.wikipedia.org/wiki/Setuid

Sudo 不适合离线使用。

稍后编辑:SSH 可以与私钥-公钥身份验证一起使用。如果私钥没有密码,可以使用 ssh 而不提示输入密码。

于 2008-10-24T12:07:15.080 回答
10

这可以通过在您将连接到的目标主机上设置公钥/私钥来完成。第一步是为在本地主机上运行脚本的用户生成一个 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从本地主机执行静默操作。

于 2012-07-30T12:54:31.337 回答
9

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

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

该命令自动提供密码。

于 2012-05-08T04:21:46.863 回答
7

看看expectlinux 实用程序。

它允许您根据 stdin 上的简单模式匹配将输出发送到 stdio。

于 2008-10-24T12:01:57.507 回答
7

如果没有更好的选择(如其他人所建议的那样),那么 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 的命令行上传递远程命令一样。

于 2011-09-15T21:30:21.723 回答
2
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
于 2017-02-17T14:08:08.607 回答
1

为公钥身份验证设置 SSH,密钥上没有密码。网络上的大量指南。那时您不需要密码即可登录。然后,您可以根据客户端主机名限制密钥的连接。提供合理的安全性,非常适合自动登录。

于 2008-10-27T15:56:17.617 回答
1

更好的sshpass选择是:passh https ://github.com/clarkwang/passh

登录到远程服务器

 $ passh -p password ssh user@host

在远程服务器上运行命令

 $ passh -p password ssh user@host date

其他传递密码的方法

-p 密码(默认值:`password')

-p env:从环境变量中读取密码

-p file:从文件中读取密码

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

于 2020-01-11T23:38:47.727 回答
1

您还可以传递各种参数,如下所示:

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

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

于 2021-08-11T21:17:10.103 回答
0
echo <password> | su -c <command> <user> 

这是有效的。

于 2010-10-18T14:02:06.383 回答
0

我有同样的问题。用于在远程 PC 上创建目录的对话框脚本。与 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

来自德国的问候

提图斯

于 2013-03-23T11:23:19.687 回答
0

基于@Jahid 的回答,这在 macOS 10.13 上对我有用:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
于 2017-11-03T23:13:38.227 回答
0

我曾经有一个用例,我需要在同一命令中运行 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"

把那个命令分解成碎片!

这将允许您使用超级用户通过您的机器运行命令:

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 包。

于 2021-12-18T23:24:31.303 回答
-1

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

于 2013-02-22T01:29:01.950 回答
-1

采用:

echo password | sudo command

例子:

echo password | sudo apt-get update; whoami

希望能帮助到你..

于 2017-03-23T08:00:45.837 回答
-3

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

于 2008-10-24T12:07:16.997 回答
-12
su -c "Command" < "Password"

希望它是有帮助的。

于 2009-10-22T14:04:12.957 回答