使用Paramiko时遇到的一些问题

文章讨论了在使用Paramiko进行SSH远程操作时遇到的三个问题:1)bash:commandnotfound错误,原因是缺少登录shell和环境变量,解决方案是使用`bash--login-c`;2)命令输出出现在stderr而非stdout,通过重定向解决;3)使用alias命令导致的问题,需使用原始命令。
摘要由CSDN通过智能技术生成

目录

1.背景

2.问题合集

1)“bash: command not found”

2)Paramiko中正常的输入,却到了stderr,而stdout是空

3)命令实际是alias


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_神经娃娃的博客-CSDN博客_paramiko bash: 未找到命令

使用paramiko中 Server not found in known_hosts的错误解决_weixin_34038652的博客-CSDN博客

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')

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值