我正在运行默认的基于 Debian 的 Linux 发行版的 Raspberry Pi 上创建两个 Bash 脚本:一个用于使我的台式计算机进入睡眠状态,另一个用于将其关闭。
关闭计算机的脚本可以正常工作,其内容如下:
sshpass -p "MYPASSWORD" ssh administrator@MYCOMPUTERNAME "shutdown /s"
我的桌面运行的是 Windows 10 以及 Windows 10 自带的内置 SSH 服务器。
但是,当我尝试运行脚本来使计算机进入睡眠状态时,我看到了以下输出:
Packet integrity error (165 bytes remaining) at ../channels.c:2401
Disconnecting: Packet integrity error.
这个脚本的内容是:
sshpass -p "MYPASSWORD" ssh administrator@MYCOMPUTERNAME "psshutdown /d"
“psshutdown”是指Windows Sysinternals 实用程序。
psshutdown /d
奇怪的是,当我坐在桌面时,从管理员命令提示符运行该命令,我的计算机成功进入睡眠状态。如果我通过 SSH 从 Pi 连接而不指定连接后要运行的命令(即sshpass -p "MYPASSWORD" ssh administrator@MYCOMPUTERNAME
,然后运行该psshutdown /d
命令),它也会起作用。直接在 Bash 中运行与脚本中相同的命令会失败,输出与上述相同。
有趣的是,当尝试以与 sleep 脚本中相同的方式运行其他命令时,有些命令可以正常工作,而有些命令会抛出不同的错误。例如,sshpass -p "MYPASSWORD" ssh administrator@MYCOMPUTERNAME "whoami"
运行正常并返回正确的输出,但sshpass -p "MYPASSWORD" ssh administrator@MYCOMPUTERNAME "date"
会产生输出exec request failed on channel 0
是什么原因导致睡眠脚本失败以及如何解决该问题以便通过 SSH 成功运行命令?
注意:我知道将 SSH 密码以纯文本形式存储在脚本文件中并不理想,但在内置 SSH 服务器上设置基于密钥的身份验证又是另一个挑战。
答案1
这可能是由于您的...尝试指定或的PATH
完整路径。psshutdown
date
没有 shell 或 PTY 的 SSH 会话很可能只有一组非常基本的PATH
设置...