如果逐行执行以下几行,则可以完美运行:
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 ...
myusername
sudo -i
答案1
我对交互式键入命令和执行命令的脚本之间的区别的看法是:速度
该wpa_supplicant
命令会打开 ssh 所需的网络链接。如果调用 ssh 命令时该网络链接未启动,会发生什么情况?在我的家用计算机上,我的 ssh 命令挂起很长时间,因为没有任何东西接收启动连接的 SYN 数据包。然后ssh超时,报错。与脚本中出现的症状相同(尽管您没有说明是否等待 ssh 错误)。
当您手动键入wpa_supplicant
命令和ssh
命令时,中间可能有 5-7 秒的时间,这足以让网络链接在 ssh 命令启动之前建立起来。当脚本执行命令时,两者之间几乎没有时间,并且当 ssh 发送第一个 SYN 数据包时链接尚未准备好。
我的建议是看看和sleep 10
之间的一条线是否适合您。echo
sudo ... ssh ...
答案2
原答案
我认为你的问题不是sshpass
在ssh
客户端,而是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
然后将选项添加-A
到sudo
服务器端。
我想你可以用以下命令开始命令行
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.