You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动