目录
2)Paramiko中正常的输入,却到了stderr,而stdout是空
1.背景
在自动化脚本中,使用了库Paramiko,远程SSH到后台服务器上做一些操作。常用操作都OK,但部分命令还是出现有一些问题。
2.问题合集
1)“bash: command not found”
关于这个问题,网上已经有很多文章给了原因和解决方法。
- 原因
默认的paramiko.SSHClient()不以“登录”模式运行shell,也不为会话分配伪终端。所以,对于非交互式会话中,.bash_profile没有来源,获取不到环境变量。
- 解决方案
原始命令:curl http://locahost:8081
最简单方法:
ssh.exec_command("bash --login -c 'curl http://locahost:8081'")
- 参考
使用 Python Paramiko exec_command 执行时,某些 Unix 命令失败并显示“<command> not found”答案 - 爱码网
paramiko连接centos7使用某些命令提示command not found_神经娃娃的博客-优快云博客_paramiko bash: 未找到命令
使用paramiko中 Server not found in known_hosts的错误解决_weixin_34038652的博客-优快云博客
2)Paramiko中正常的输入,却到了stderr,而stdout是空
目前也不知道为什么Paramiko会把这个命令的输出,收集在了stderr中。不过,也还是有办法。例如:
原始命令:curl http://locahost:8081。输出的stderr中。
- 解决方法
将stderr的内容重定向到stdout。
ssh.exec_command('curl http://localhost:8081 2>&1')
- 参考
在Paramiko中执行curl时,它的输出是stderr,而不是stdout - 问答 - 腾讯云开发者社区-腾讯云
Linux如何在Bash中将标准错误stderr重定向到stdout标准输出 - 腾讯云开发者社区-腾讯云
3)命令实际是alias
- 原因
一些命令可能为了方便,做了一些alias。虽然在SSH会话上执行是可以的,但通过paramiko时就不一定能成功了。如果使用下面这样的方法,执行后就会报错:command not found。
ssh.exec_command('pod')
先找到别名的原始命令,例如:
# cat /opt/bin/common/cmds.sh
#!/bin/bash
alias pod='kubectl get --all-namespaces pod -o wide'
- 解决方法
使用原本的命令即可。
ssh.exec_command('kubectl get --all-namespaces pod -o wide')