-
Star
(127)
You must be signed in to star a gist -
Fork
(30)
You must be signed in to fork a gist
-
-
Save bortzmeyer/1284249 to your computer and use it in GitHub Desktop.
#!/usr/bin/python | |
# All SSH libraries for Python are junk (2011-10-13). | |
# Too low-level (libssh2), too buggy (paramiko), too complicated | |
# (both), too poor in features (no use of the agent, for instance) | |
# Here is the right solution today: | |
import subprocess | |
import sys | |
HOST="www.example.org" | |
# Ports are handled in ~/.ssh/config since we use OpenSSH | |
COMMAND="uname -a" | |
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], | |
shell=False, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE) | |
result = ssh.stdout.readlines() | |
if result == []: | |
error = ssh.stderr.readlines() | |
print >>sys.stderr, "ERROR: %s" % error | |
else: | |
print result | |
this gist aged well. ELL OH ELL
edit: good luck with all your forked processes. i'm happy with paramiko.
Hi All ,
I need a help . I am using below code as I want ssh to run few commands in bash mode . But I am getting errors .
import subprocess
import sys
HOST="[email protected]". # change the IP as per ur testing
COMMAND="ls / -ltrh"
print("Type ",type(COMMAND))
ssh = subprocess.Popen(["ssh", "%s" % HOST, "%s" %COMMAND],
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
error = ssh.stderr.readlines()
print >>sys.stderr, "ERROR: %s" % error
else:
print(result)
(venv) [rrshanke@slc10gon ADW]$ python ssh_try.py
('Type ', <type 'str'>)
ERROR: ['usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]\n', ' [-D [bind_address:]port] [-E log_file] [-e escape_char]\n', ' [-F configfile] [-I pkcs11] [-i identity_file]\n', ' [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]\n', ' [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]\n', ' [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]\n', ' [user@]hostname [command]\n']
(venv) [rrshanke@slc10gon ADW]$
I am not sure what is wrong . Please help me
ssh = subprocess.Popen(["ssh", "%s" % HOST, "%s" %COMMAND],
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
You should read the documentation. https://docs.python.org/3/library/subprocess.html Executive summary: shell=True
is both dangerous and a bad idea in most cases. From a Python program, shell=False
is the right solution most of the time. (See in the doc, around "If shell is True, it is recommended to pass args as a string rather than as a sequence.")
SSH without third-party library
Here is my take on SSH without using third-party library. I leveraged a concept of fork
system call in UNIX [1].
# Create an ssh session with python
import os
import shlex
def create_ssh(host, user):
"""Create a ssh session"""
ssh = "/usr/bin/ssh -t {user}@{host} ".format(user=user, host=host)
# Now, fork a child from current process
# This is a basic concept from Operating System class.
pid = os.fork()
if pid == 0: # a child process
print("Executing: %s" %(ssh))
cmd = shlex.split(ssh)
os.execv(cmd[0], cmd)
os.wait(pid, 0)
print("ssh session is finished. :)")
if __name__ == "__main__":
create_ssh(
host="remote_host",
user="remote_user")
Amazing
Still populating top three google results when searching for 'python3 connect ssh and run script' :)
Still true today. Amazing how badly libraries like paramiko and fabric fail at such a simple task.
Still a valid chain but still finding it hard to reliably send password from Osx or linux
thank you
Can tell how amazing it is when this solution still works today.
Thanks a lot.
how does this convert over to Android file system?
Your script works perfectly from my kodi on windows and ssh's into a raspberry pi. I'm trying to get this working from an android Xiamoi Mi box. Any suggestions? :)