在 Paramiko 中执行多个命令,使命令受到其前任的影响

Posted

技术标签:

【中文标题】在 Paramiko 中执行多个命令,使命令受到其前任的影响【英文标题】:Execute multiple commands in Paramiko so that commands are affected by their predecessors 【发布时间】:2018-03-26 13:27:12 【问题描述】:

我正在慢慢尝试为 SSH 然后 FTP 制作一个 python 脚本来做一些我必须一直做的手动文件。我正在使用 Paramiko,会话似乎在命令,并打印目录,但我的更改目录命令似乎不起作用,它打印我开始的目录:/01/home/

import paramiko

hostname = ''
port = 22
username = ''
password = ''
#selecting PROD instance, changing to data directory, checking directory
command = 
    1:'ORACLE_SID=PROD',2:'cd /01/application/dataload',3:'pwd'


ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname,port,username,password)

for key,value in command.items():
    stdin,stdout,stderr=ssh.exec_command(value)
    outlines=stdout.readlines()
    result=''.join(outlines)
    print (result)
ssh.close()

【问题讨论】:

【参考方案1】:

当您多次运行exec_command 时,每个命令都在其自己的“shell”中执行。所以前面的命令对后面命令的环境没有影响。

如果您需要前面的命令来影响后面的命令,只需使用服务器 shell 的适当语法即可。大多数 *nix shell 使用分号或双与号(具有不同的语义)来指定命令列表。在您的情况下,与号更合适,因为它仅在先前的命令成功时才执行以下命令:

command = "ORACLE_SID=PROD && cd /01/application/dataload && pwd"
stdin,stdout,stderr = ssh.exec_command(command)

在许多情况下,您甚至不需要使用多个命令。

例如,您可以在交互式使用 shell 时代替这个序列:

cd /path
ls

你可以这样做:

ls /path

另请参阅: How to get each dependent command execution output using Paramiko exec_command


强制性警告:不要单独使用AutoAddPolicy - 这样做会失去对MITM attacks 的保护。如需正确解决方案,请参阅Paramiko "Unknown Server"

【讨论】:

【参考方案2】:

我相信,通过不小心尝试了一些东西,我设法弄清楚了这一点。您需要一次执行所有命令,而无需循环执行。对于我来说,它会是

import paramiko

hostname = ''
port = 22
username = ''
password = ''
#selecting PROD instance, changing to data directory, checking directory
command = 'ORACLE_SID=PROD;cd /01/application/dataload;pwd'
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname,port,username,password)
stdin,stdout,stderr=ssh.exec_command(value)
outlines=stdout.readlines()
result=''.join(outlines)
print (result)
ssh.close()

【讨论】:

以上是关于在 Paramiko 中执行多个命令,使命令受到其前任的影响的主要内容,如果未能解决你的问题,请参考以下文章

使用Paramiko单独执行多个相关命令,并找出每个命令何时完成

python之paramiko 远程执行命令

使命令的输出出现在单行上[关闭]

paramiko实现SSH交互式命令执行

linux环境中使用转义字符使命令行字符颜色高亮

简单的 IF Else,但是当我尝试生成错误时使命令框崩溃 [关闭]