2

Hello All i'm stuck with a small problem. May be i'm missing something obvious but i'm unable to figure out the problem. I've GUI where i have a button named "erp" and if i press that it should do an ssh first to a machine named (host id name) 'ayaancritbowh91302xy' and then it should execute commands like (cd change dir) and 'ls -l'. I've tried the following code:

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)

i got the following error:

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.

How to do this? can anyone help me with this?

6
  • 1
    start by fixing the stdout error: try adding "from sys import stdout" or change it to sshProcess.stdout if that's what you mean. Commented Oct 7, 2014 at 2:45
  • consider adding a '-T' after 'ssh', so that ssh won't even try to allocate a pseudo-terminal. Commented Oct 7, 2014 at 2:45
  • i used '-t' after ssh now i got the following error: File "Cae_Selector.py", line 35, in erptool for line in stdout.readlines(): IOError: File not open for reading usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b 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 login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q cipher | cipher-auth | mac | kex | ke Commented Oct 7, 2014 at 2:50
  • sorry -- it's capital T Commented Oct 7, 2014 at 2:51
  • 1
    @ayaan If you want to keep the ssh process open in the background, don't use communicate but take a look at the accepted answer for stackoverflow.com/questions/375427/… Commented Oct 7, 2014 at 3:41

3 Answers 3

5

Try this:

#!/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()

I added -T so ssh wouldn't try to allocate a pseudo-tty, and avoid END and stdout issues by using communicate.

Sign up to request clarification or add additional context in comments.

Comments

4

To execute several shell commands via 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 contains stdout, error -- stderr, p.returncode -- exit status.

2 Comments

so if i want to open a software will this method [email protected]
@ayaan: it depends on software. Your comment to the other answer suggests that you want to run matlab, see Run Matlab in Linux without graphical environment?: try matlab -nodesktop. If it doesn't work, update your question or ask a new one.
0

It must be sshProcess.stdout.readLines() as you are talking to the process's stdout....

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.