簡體   English   中英

在 Paramiko 中執行多個命令,使命令受到其前任的影響

[英]Execute multiple commands in Paramiko so that commands are affected by their predecessors

我正在慢慢嘗試將 python 腳本制作為 SSH 然后 FTP 做一些手動文件,我必須一直這樣做。 我正在使用 Paramiko 和 session 似乎命令,並打印目錄,但我的更改目錄命令似乎不起作用,它打印我開始的目錄: /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()

當您多次運行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

另請參閱:如何使用 Paramiko exec_command 獲取每個依賴的命令執行輸出

好吧,通過不小心嘗試了一些東西,我設法弄清楚了這一點,我相信。 您需要一次執行所有命令,不需要循環執行。 就我而言,它將是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM