【问题标题】:write bash command in python script [duplicate]在python脚本中编写bash命令[重复]
【发布时间】:2013-12-25 13:46:46
【问题描述】:

Bash 脚本:

ACTIVE_MGMT_1=`ssh -n ${MGMT_IP_1}  ". .bash_profile; xms sho proc TRAF.*" 2>/dev/null |egrep " A " |awk '/TRAF/{print $1}' |cut -d "." -f2`;
STANDBY_MGMT_1=`ssh -n ${MGMT_IP_2} ". .bash_profile; xms sho proc TRAF.*" 2>/dev/null |egrep " S " |awk '/TRAF/{print $1}' |cut -d "." -f2`;
MGMT_HOSTNAME_1=`ssh -n ${MGMT_IP_1} hostname 2>/dev/null`;
MGMT_HOSTNAME_2=`ssh -n ${MGMT_IP_2} hostname`2>/dev/null;
ssh -n ${MGMT_IP_1} ". .bash_profile; if [ ! -d "$MGMT_FOLDER" ]; then   mkdir $MGMT_FOLDER; fi " 2>/dev/null 1>&2  
ssh -n ${MGMT_IP_2} ". .bash_profile; if [ ! -d "$MGMT_FOLDER" ]; then   mkdir $MGMT_FOLDER; fi " 2>/dev/null 1>&2 
if [ -z "${ACTIVE_MGMT_1}" ] && [ -z "${STANDBY_MGMT_1}" ]; then
        log "ERROR" "No active blade on Site: ${SITE_NAME}, first cluster. Skipping";
        continue;
fi

log "INFO" "First Active blade: ${ACTIVE_MGMT_1} , standby: ${STANDBY_MGMT_1}";
log "INFO" "First Mng $MGMT_HOSTNAME_1 $MGMT_HOSTNAME_2"; 

我开始把它翻译成python:

#Check active MGMT on cluster 1
sp = subprocess.Popen(['ssh', '-n', '10.128.136.36', '. .bash_profile; xms sho proc TRAF.*', 'egrep', 'A'], stdout=subprocess.PIPE, stderr=None)
#ACTIVE_MGMT_1=`ssh -n ${MGMT_IP_1}  ". .bash_profile; xms sho proc TRAF.*" 2>/dev/null |egrep " A " |awk '/TRAF/{print $1}' |cut -d "." -f2`;
sp = subprocess.Popen(['ssh', '-n', '10.128.136.36', '. .bash_profile; xms sho proc TRAF.*'], stdout=subprocess.PIPE, stderr=None)
#STANDBY_MGMT_1=`ssh -n ${MGMT_IP_2} ". .bash_profile; xms sho proc TRAF.*" 2>/dev/null |egrep " S " |awk '/TRAF/{print $1}' |cut -d "." -f2`; 

任何建议如何做其他行?

【问题讨论】:

  • 请格式化您的代码,以便您的问题可读。
  • 问题在哪里?请避免模棱两可或开放式问题。您的问题应该在帖子的开头,是一个以“?”结尾的简洁而具体的短句! ;-) 所以收件人可以快速确定他们是否适合回答。然后添加您的具体问题(例如错误)添加一些代码和错误日志。
  • 您可以在这里找到更优雅的解决方案:stackoverflow.com/questions/3586106/…

标签: python


【解决方案1】:

您可以考虑使用像 paramiko 这样的 python 模块,并像他们的示例一样发出您的命令:

import paramiko, base64
key = paramiko.RSAKey(data=base64.decodestring('AAA...'))
client = paramiko.SSHClient()
client.get_host_keys().add('ssh.example.com', 'ssh-rsa', key)
client.connect('ssh.example.com', username='strongbad', password='thecheat')
stdin, stdout, stderr = client.exec_command('. .bash_profile; xms sho proc TRAF.*')
for line in stdout:
     # do your grep/awk stuff here!
     print '... ' + line.strip('\n')
client.close()

我从未在野外使用过该模块,所以我不确定您是否可以使用多个命令执行exec_command(),但我想在远程主机上编写一个小脚本来设置可能是个好主意环境,以便一切正常运行,只需调用该脚本即可。

这是一个好主意的另一个原因是您只打开一个到服务器的 SSH 连接,而不是打开/关闭多个会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 2015-12-22
    • 2015-10-30
    • 2020-02-10
    • 2017-11-21
    • 1970-01-01
    • 2014-12-04
    • 2018-11-08
    相关资源
    最近更新 更多