SSH远程启动程序失败求助:依赖库缺失及脚本执行异常
解决远程SSH执行程序及脚本的路径与库加载问题
一、共享库加载失败的原因与解决
问题根源
你执行ssh user@ip "echo $LD_LIBRARY_PATH"时,$LD_LIBRARY_PATH是本地shell提前解析的变量,并非远程机器的实际值,所以看起来和登录后一致是误导。远程非交互式SSH会话不会自动加载用户的.profile/.bashrc等配置文件,导致LD_LIBRARY_PATH未正确设置,进而找不到libxmlrpcpp.so。
解决方法
显式设置库路径后执行程序
在SSH命令中直接导出环境变量,再启动程序:ssh user@ip "export LD_LIBRARY_PATH=/实际库目录:$LD_LIBRARY_PATH && /home/xx/remote_program"将
/实际库目录替换为libxmlrpcpp.so所在的真实路径。强制加载远程用户配置文件
如果库路径是在~/.bashrc或~/.profile中配置的,可让SSH启动交互式登录shell加载配置:ssh user@ip -t "bash -lc '/home/xx/remote_program'"-t强制分配伪终端,-lc让bash以登录shell模式执行命令,会自动加载用户的环境配置文件。
二、脚本执行时路径异常的原因与解决
问题根源
通过ssh user@ip "/home/xx/demo_dir/start.sh"执行脚本时,脚本的工作目录是远程用户的HOME目录(如/home/user),而非脚本所在的/home/xx/demo_dir,所以脚本里的env.sh、build等相对路径会指向HOME目录下的文件,自然找不到。
解决方法
修改start.sh,让脚本先切换到自身所在目录,再执行后续操作:
#!/bin/bash # 获取脚本所在的绝对目录 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 切换到脚本所在目录 cd "$SCRIPT_DIR" # 执行原有逻辑 source env.sh cd build ./demo
这种方式让脚本不受执行路径影响,无论从哪里启动,都会自动切换到自身所在目录,相对路径即可正确指向目标文件。
也可以在SSH命令中先切换目录再执行脚本(仅临时解决):
ssh user@ip "cd /home/xx/demo_dir && ./start.sh"
内容的提问来源于stack exchange,提问作者Zeng Huang
相关产品推荐
相关产品推荐

