ssh 连接无法通过脚本工作

ssh 连接无法通过脚本工作

如果逐行执行以下几行,则可以完美运行:

sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sudo -i sshpass -p mypassphrase ssh [email protected] -T 'sudo mkdir /home/myusername/myFolder';

但是,将它们作为块或在脚本中执行会导致输出

Successfully initialized wpa_supplicant
This echo still works.

最后的线路永远运行。也没有创建目录。

任何建议都将受到高度赞赏。

编辑#1

感谢您迄今为止的回答。

@Sotto Voce:是的,wpa_supplicant 会启动 ssh 所需的连接。

@sudodus:谢谢您的回答。不需要在 ssh 命令行中使用 sudo 来重现此问题。抱歉,如果这在我原来的帖子中令人困惑。无论如何,简化的代码

sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sshpass -p mypassphrase ssh [email protected] 'who';

显示相同的效果:如果从终端逐行粘贴并执行,效果很好。然而,如果所有行同时执行(例如在一个脚本中),那么最后一行将永远执行。

我目前正在思考的方向: 仅从终端执行或与 组合执行 时需要有所不同,如果预先使用, 可能不被接受?sshpass -p mypassphrase ssh [email protected] 'who';sudo -i wpa_supplicant ...myusernamesudo -i

答案1

我对交互式键入命令和执行命令的脚本之间的区别的看法是:速度

wpa_supplicant命令会打开 ssh 所需的网络链接。如果调用 ssh 命令时该网络链接未启动,会发生什么情况?在我的家用计算机上,我的 ssh 命令挂起很长时间,因为没有任何东西接收启动连接的 SYN 数据包。然后ssh超时,报错。与脚本中出现的症状相同(尽管您没有说明是否等待 ssh 错误)。

当您手动键入wpa_supplicant命令和ssh命令时,中间可能有 5-7 秒的时间,这足以让网络链接在 ssh 命令启动之前建立起来。当脚本执行命令时,两者之间几乎没有时间,并且当 ssh 发送第一个 SYN 数据包时链接尚未准备好。

我的建议是看看和sleep 10之间的一条线是否适合您。echosudo ... ssh ...

答案2

原答案

我认为你的问题不是sshpassssh客户端,而是sudo在服务器端。

在那里设置密码的一种方法是设置变量SUDO_ASKPASS。在我的主计算机中,在文件中~/.profile我有一行

export SUDO_ASKPASS=/usr/bin/ssh-askpass

我可以检查

echo $SUDO_ASKPASS

它就在那儿并且即将到来

which ssh-askpass

该程序也在它应该在的地方。该特定程序有一个 GUI,因此我将ssh -X其提供给来宾端。您也许也可以sshpass -p在服务器端使用(您必须有权访问此类操作)。

无论如何,这对我有用:

ssh -tX [email protected] 'source /home/myuser/.profile; sudo -A fdisk -lu /dev/sda'

sudo在客户端计算机桌面上弹出的一个小窗口中输入服务器的密码,然后sudo运行fdisk并在活动终端窗口中显示结果。

你的情况可能会有所不同。首先,您必须在服务器中检查/安装合适的密码程序sshpass(如果您不想)。ssh-askpass然后将选项添加-Asudo服务器端。

我想你可以用以下命令开始命令行

sshpass -p password ssh ...

出于安全原因,我不会用来sudo运行。ssh显式密码已经够糟糕的了,但有时要保持较高的安全级别又太麻烦了。

编辑1:

第一次反馈后,我再次进行了测试,从您的脚本修改而来的只是为了匹配我的用户 ID,该脚本可以工作,但效果不佳,但在添加选项-t(小写 t)后,它工作得更好,还显示了如何管理 ssh 会话。我注释掉了该行,wpa_supplicant因为它与我无关(我不知道它在做什么,但我希望它不会破坏 的东西ssh)。

我的脚本ssher

#!/bin/bash

#sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sshpass -p mypassword  ssh -t [email protected] 'who';

运行时无需-t

$ ./ssher
This echo still works.
olle     tty7         2022-07-18 15:12 (:0)

使用 运行-t,如上面脚本所示:

$ ./ssher
This echo still works.
olle     tty7         2022-07-18 15:12 (:0)
sudodus  pts/1        2022-07-19 22:50 (192.168.0.12)
Connection to 192.168.0.2 closed.

相关内容