我的 Windows 计算机上有一个
.bat
文件。此 .bat
文件使用 plink.exe
连接到 Ubuntu 计算机并执行 .sh
脚本。但是,根据 Plink 的使用方式,我在脚本上得到了不同的行为:
直接(亲自)登录Ubuntu -- 脚本成功
通过 Bitvise 客户端进行 ssh -- 脚本成功
通过 Plink ssh(通过调用
plink.exe
)并从交互式 shell 调用脚本(它是 Windows 中的 Ubuntu shell cmd.exe
)——脚本成功通过
.bat
进行 ssh,然后调用 Plink -- 脚本失败脚本失败并显示消息:
加载共享库时出错:libCint.so:无法打开共享对象文件:没有这样的文件或目录
其他帖子似乎提到了
libCint.so
的安装/权限问题,但我知道情况并非如此,因为脚本在其他实例中可以正常工作,如上所示。
下面是我的
plink.exe
文件中的 .bat
行:
plink.exe !plink_ssh_details! myscript
通过
.bat
文件以这种方式调用上述脚本会失败;再次注意,当直接从 Ubuntu 调用或通过 cmd.exe
(使用 plink.exe
)或 Bitvise 客户端直接 ssh 进入 Ubuntu 时,它会成功。任何帮助将不胜感激。
在其他情况下,您正在使用交互式会话。
虽然 Plink 默认使用非交互式会话,但当您在其命令行上指定命令时。
您的脚本可能依赖于一些专门设置的环境变量(如
PATH
)。或者可能定义一个别名。
很可能仅为交互式会话设置变量/别名。可能是因为它们在仅针对交互式会话执行(来源)的启动脚本中进行了修改。
解决方案是:
更正启动脚本以无条件修改变量/别名(即使对于非交互式会话)。
修改脚本,使其不依赖环境变量/别名。
或者您可以获取配置文件脚本,请参阅无法使用 PLINK 从 Windows 中通过 ktutil 命令运行 shell 脚本。
使用
-t
开关强制 Plink 使用交互式会话
这不是推荐的解决方案,因为使用交互式会话自动执行命令可能会给您带来令人讨厌的副作用。例如,请参阅是否有一种简单的方法可以消除使用 Python 的 Paramiko 库进行 SSH 并从远程计算机的 CLI 获取输出时出现的垃圾值?
当使用“exec”通道执行命令时,一些更不起眼的 SSH 服务器也可能表现不同。请参阅在 Plink 命令行上执行命令失败并显示“未找到”。
我必须想出一个解决方案来解决这个问题。在我从 .bat 文件调用的 bash 脚本的标题中添加“-i”选项就达到了目的:
#!/bin/bash -i
请注意使用此选项时会出现一些不必要的副作用的警告(尽管没有提及具体细节...)。但是,从远程 ssh 会话调用这个交互式脚本(例如,当从 Windows .bat 文件使用 plink.exe 并将内联命令传递到 Unix 框时)可以解决有关文件/目录可见性和权限问题的任何问题。
plink 用户请注意:如果您通过 plink 在 Unix 上调用脚本并注意到该脚本的行为不符合预期...添加“-i”可能有助于调试/解决您的问题。再次请注意,有些人声称这种黑客攻击会带来不必要的副作用,但他们/我并没有意识到。