我的Windows机器上有一个.bat
文件。 这个.bat
文件使用plink.exe
连接到一台Ubuntu机器并执行一个.sh
脚本。 但是,根据Plink的使用方式,我在脚本上得到了不同的行为:
直接login到Ubuntu(亲自) – 脚本成功
SSH通过Bitvise客户端 – 脚本成功
ssh通过Plink(通过调用plink.exe
)并从交互式shell(这是Windows cmd.exe
的Ubuntu shell)调用脚本 – 脚本成功
ssh通过.bat
然后调用Plink 脚本失败
该脚本失败w / message:
加载共享库时出错:libCint.so:无法打开共享对象文件:没有这样的文件或目录
其他post似乎是指libCint.so
安装/权限问题,但我知道情况并非如此,因为脚本在其他情况下正常工作,如上所示。
下面是我的.bat
文件中的plink.exe
行:
plink.exe !plink_ssh_details! myscript
以上脚本通过.bat
文件调用时失败; 再次请注意,它直接从Ubuntu调用时,或者当我通过cmd.exe
(使用plink.exe
)或Bitvise客户端直接进入Ubuntu时成功。 任何帮助,将不胜感激。
在其他情况下,您正在使用交互式会话。
虽然默认情况下Plink使用非交互式会话,但在命令行上指定一个命令时。
你的脚本可能依赖于一些环境变量(如PATH
)被专门设置。
这些变量很可能仅用于交互式会话。 可能是因为它们是在仅为交互式会话执行(源)的启动脚本中修改的。
解决方案是:
更正启动脚本以无条件地修改变量(即使对于非交互式会话)。
修改脚本不要依赖于环境变量。
强制Plink使用-t
开关使用交互式会话
这不是推荐的解决方案,因为使用交互式会话来自动执行命令可能会带来令人讨厌的副作用。 例如,看看有没有一种简单的方法来摆脱当你使用Python的Paramiko库进行SSH并从远程机器的CLI获取输出时出现的垃圾值?
我不得不破解一个解决方案来解决这个问题。 在我从.bat文件中调用的bash脚本的头部添加一个“-i”选项的窍门是:
#!/bin/bash -i
注意一些使用此选项时警告不需要的副作用(没有提到具体细节)。 但是从远程ssh会话中调用这个交互式脚本(例如,使用Windows .bat文件中的plink.exe并将内联命令传递给Unix框)可以解决有关文件/目录可见性和权限问题的任何问题。
请注意plink用户:如果您通过plink在Unix上调用脚本,并注意到脚本没有像预期的那样运行,那么添加“-i”可能有助于调试/解决您的问题。 再次注意,有些人声称他们/我不知道这种黑客的不良后果。