Выполните несколько команд в Paramiko, чтобы на команды влияли их предшественники

Я медленно пытаюсь сделать Python-скрипт для SSH, а затем для FTP, чтобы сделать ручное получение файла, которое я должен делать все время. Я использую Paramiko, и сеанс, кажется, командует, и печатает каталог, но моя команда изменения каталога, похоже, не работает, она печатает каталог, в котором я запускаю

/01/ Главная /

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

2 ответа

Когда ты бежишь exec_command Несколько раз каждая команда выполняется в своей "оболочке". Таким образом, предыдущие команды не влияют на окружение следующих команд.

Если вам нужно, чтобы предыдущие команды влияли на следующие команды, просто используйте соответствующий синтаксис вашей серверной оболочки. Большинство оболочек * nix используют точку с запятой или двойной амперсанд (с различной семантикой) для указания списка команд. В вашем случае амперсанд является более подходящим, поскольку он выполняет следующие команды, только если предыдущие команды выполняются успешно:

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

Ну, случайно попробовав что-то, мне удалось выяснить это, я верю. Вам нужно выполнять все команды одновременно и не делать их в цикле. для моего примера это было бы

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()
Другие вопросы по тегам