Python中用Paramiko通过SSH执行命令遇bbjobs找不到问题
解决Paramiko执行bbjobs命令提示"command not found"的问题
这问题我之前折腾过好一阵子,核心原因其实是WinSCP和Paramiko启动的Shell环境完全不一样:
- WinSCP连接服务器后默认是交互式登录Shell,会自动加载你的用户配置文件(比如
~/.bash_profile、~/.bashrc),这些文件里应该已经配置了LSF集群的全套环境变量(包括PATH和依赖的动态链接库路径),所以bbjobs能正常跑起来。 - 而Paramiko的
exec_command默认启动的是非交互式非登录Shell,不会加载这些用户配置,导致环境变量不全——哪怕你用了bbjobs的完整路径,也可能因为缺少依赖的库路径(比如LD_LIBRARY_PATH)而执行失败。
下面是几个亲测可行的解决方案:
方案1:用登录Shell执行命令
直接让Paramiko启动登录Shell来运行bbjobs,这样会自动同步WinSCP的环境配置,最省心:
import paramiko # 先建立SSH连接(假设你已经完成这部分配置) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('你的服务器IP', username='你的用户名', password='你的密码') # 用bash登录Shell执行bbjobs stdin, stdout, stderr = ssh.exec_command('bash -l -c "bbjobs"') # 读取输出和错误信息 output = stdout.read().decode() error = stderr.read().decode() print("命令输出:", output) print("错误信息:", error) ssh.close()
如果需要给bbjobs传参数,注意处理好引号的转义(用f-string拼接时要小心):
target_job_id = "12345" stdin, stdout, stderr = ssh.exec_command(f'bash -l -c "bbjobs {target_job_id}"')
方案2:手动设置环境变量再执行
如果你清楚bbjobs依赖的所有环境变量,可以在执行命令前手动导出:
# 假设bbjobs的完整路径是/cluster/apps/lsf/10.1/linux2.6-x86_64/bin/bbjobs # 依赖的库路径是/cluster/apps/lsf/10.1/linux2.6-x86_64/lib cmd = 'export LD_LIBRARY_PATH=/cluster/apps/lsf/10.1/linux2.6-x86_64/lib && /cluster/apps/lsf/10.1/linux2.6-x86_64/bin/bbjobs' stdin, stdout, stderr = ssh.exec_command(cmd)
方案3:先排查环境变量差异
如果不确定具体缺什么环境变量,可以先对比两种Shell的环境:
- 在WinSCP里执行
printenv > winscp_env.txt,下载这个文件到本地 - 在Paramiko里执行
printenv > paramiko_env.txt,下载后对比两个文件,找出差异的环境变量,然后在执行bbjobs前手动设置这些变量。
内容的提问来源于stack exchange,提问作者Jonas Wydler




