PowerShell通过SSH远程执行Linux脚本时共享库找不到问题求助
问题原因
- 远程SSH执行命令时默认启动的是非登录、非交互式shell,不会加载
~/.bashrc、~/.bash_profile等用户自定义环境变量配置文件 - 本地登录Linux执行脚本时,已经将自定义共享库的路径添加到了
LD_LIBRARY_PATH环境变量中,而远程执行时该变量没有加载对应路径,导致程序找不到依赖的.so文件 - 额外的
TERM environment variable not set报错也是因为非交互式shell没有默认设置TERM变量导致的
解决方案
方案1:修改start.sh脚本,主动设置环境变量(最推荐,不依赖执行环境)
在脚本最开头添加环境变量配置,直接把依赖的库路径和TERM变量写死在脚本内,避免不同执行环境的差异:
#!/bin/bash # 显式指定共享库搜索路径,路径替换为你实际存放libentity.so、libboost.so的目录,当前目录可以写./ export LD_LIBRARY_PATH=./:/home/iris/your_app_path:$LD_LIBRARY_PATH # 解决TERM变量未设置的报错 export TERM=xterm echo echo "Running comms.exe" ./comms.exe& echo echo "Running abc.exe" ./abc.exe& echo echo "Running PM2" pm2 start exit 0
如果你的共享库路径已经配置在~/.bashrc里,也可以直接在脚本开头加source ~/.bashrc导入所有环境变量。
方案2:修改plink执行命令,强制启动登录shell加载配置
执行plink时指定启动登录式bash,自动加载用户的环境变量配置,命令修改为:
plink -pw tpstps iris@192.168.5.58 "bash -l ./start.sh"
方案3:将自定义共享库路径加入系统全局库配置(永久生效,适合固定部署的环境)
如果你的程序是固定部署在该Linux设备上,可以直接把库路径加入系统全局配置,所有用户、所有执行方式都能识别:
- 找到你存放
libentity.so.5.4.beta和libboost_serialization.so.1.59.0的目录,例如为/home/iris/app/lib - 用root权限执行以下命令写入配置:
echo "/home/iris/app/lib" >> /etc/ld.so.conf.d/custom-app.conf
- 刷新系统库缓存生效:
ldconfig
内容的提问来源于stack exchange,提问作者Muhammad Waris
相关产品推荐
相关产品推荐

