2014-10-07 2 views
0

Здравствуйте, Все, у меня возникла небольшая проблема. Может быть, я пропустил что-то очевидное, но я не могу понять проблему. У меня есть GUI, где у меня есть кнопка с именем «erp», и если я нажму на нее, то она должна сначала сделать ssh машине с именем (имя хоста) 'ayaancritbowh91302xy', а затем она должна выполнить команды типа (cd change dir) и 'ls -l'. Я попытался следующий код:ssh с Subprocess.popen

def erptool(): 
    sshProcess = subprocess.Popen(['ssh -T', 'ayaancritbowh91302xy'],stdin=subprocess.PIPE, stdout = subprocess.PIPE) 
    sshProcess.stdin.write("cd /home/thvajra/transfer/08_sagarwa\n") 
    sshProcess.stdin.write("ls -l\n") 
    sshProcess.stdin.write("echo END\n") 
    for line in stdout.readlines(): 
     if line == "END\n": 
     break 
     print(line) 

я получил следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "Cae_Selector.py", line 34, in erptool 
    for line in stdout.readlines(): 
NameError: global name 'stdout' is not defined 
Pseudo-terminal will not be allocated because stdin is not a terminal. 

Как это сделать? Кто-нибудь может мне с этим помочь?

+1

начало с исправления ошибки stdout: попробуйте добавить «из sys import stdout» или изменить его на sshProcess.stdout, если это то, что вы имеете в виду. –

+0

рассмотреть возможность добавления '-T' после 'ssh', так что ssh даже не попытается выделить псевдотерминал. –

+0

Я использовал '-t' после ssh, теперь я получил следующую ошибку: Файл «Cae_Selector.py», строка 35, в erptool для строки в stdout.readlines(): IOError: Файл не открыт для чтения Использование: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-c bind_address] [-c cipher_spec] [-D [bind_address:] port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-L [bind_address:] port: host: hostport] [-l имя_файла] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q cipher | cipher-auth | mac | kex | ke – ayaan

ответ

2

Попробуйте это:

#!/usr/bin/env python 
import subprocess 
def erptool(): 
    sshProcess = subprocess.Popen(['ssh', '-T', 'ayaancritbowh91302xy'], 
            stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    out, err = sshProcess.communicate("cd /home/thvajra/transfer/08_sagarwa\nls -l\n") 
    print(out), 
erptool() 

Я добавил -T так SSH не будет пытаться выделить псевдо-tty и избежать проблем с END и stdout с помощью связи.

+0

это сработало спасибо @Nick Russo – ayaan

1

Это должно быть sshProcess.stdout.readLines(), как вы говорите на стандартный вывод текущего процесса ....

2

Чтобы выполнить несколько команд оболочки с помощью SSH:

#!/usr/bin/env python3 
from subprocess import Popen, PIPE 

with Popen(['ssh', '-T', 'ayaancritbowh91302xy'], 
      stdin=PIPE, stdout=PIPE, stderr=PIPE, 
      universal_newlines=True) as p: 
    output, error = p.communicate("""    
     cd /home/thvajra/transfer/08_sagarwa 
     ls -l 
     """) 
    print(output) 
    print(error) 
    print(p.returncode) 

output содержит стандартный вывод, error - STDERR, p.returncode - статус выхода.

+0

, так что если я хочу открыть программное обеспечение, этот метод будет работать @ JFSebastian – ayaan

+0

@ayaan: это зависит от программного обеспечения. Ваш комментарий к другому ответу предполагает, что вы хотите запустить matlab, см. [Run Matlab в Linux без графической среды?] (Http://stackoverflow.com/q/11046470/4279): попробуйте 'matlab -nodesktop'. Если это не сработает, [обновите свой вопрос] (http://stackoverflow.com/posts/26227791/edit) или [попросите новый] (http://stackoverflow.com/questions/ask). – jfs

+0

Я посмотрю на это спасибо – ayaan

Смежные вопросы