web-dev-qa-db-ja.com

Pythonを使用してSSHを行う最も簡単な方法は何ですか?

ローカルPython(3.0)スクリプトからリモートサーバーにSSH接続し、ログイン/パスワードを入力し、コマンドを実行してPythonコンソールに出力を印刷するにはどうすればよいですか。

大規模な外部ライブラリを使用したり、リモートサーバーに何かをインストールしたりすることは避けたいです。

78

試したことはありませんが、この pysftp モジュールが役立つ場合があり、これはparamikoを使用します。私はすべてがクライアント側だと信じています。

興味深いコマンドはおそらく.execute()で、リモートマシン上で任意のコマンドを実行します。 (このモジュールには、FTP文字をさらに暗示する.get()および.putメソッドもあります)。

更新:

最初にリンクしたブログ投稿が利用できなくなった後、答えを書き直しました。この回答の古いバージョンを参照するコメントの一部は、今では奇妙に見えます。

40
ThomasH

上で提案したように、Paramikoを使用して自分でコーディングできます。または、Fabric、pythonアプリケーションを調べて、あなたが尋ねたすべてのことを行うことができます:

FabricはPythonライブラリおよびコマンドラインツールであり、SSHプロトコルを介してアプリケーションの展開やシステム管理タスクの実行を合理化します。任意のシェルコマンドを実行する(通常のログインユーザーとして、またはSudo経由で)、ファイルをアップロードおよびダウンロードするなどのツールを提供します。

これはあなたのニーズに合っていると思います。また、大きなライブラリではなく、サーバーのインストールを必要としませんが、クライアントへのインストールを必要とするparamikoおよびpycryptに依存します。

以前はアプリは here でした。ここで見つけることができます here

* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric

いくつかの優れた記事がありますが、過去6か月で変更されているため、注意が必要です。

FabricでDjangoをデプロイする

モダンPythonハッカーのツール:Virtualenv、Fabric、Pip

FabricとVirtualenvを使用したシンプルで簡単な展開


後で:Fabricはparamikoをインストールする必要がなくなりました:

$ pip install fabric
Downloading/unpacking fabric
  Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded
  Running setup.py Egg_info for package fabric
    warning: no previously-included files matching '*' found under directory 'docs/_build'
    warning: no files found matching 'fabfile.py'
Downloading/unpacking ssh>=1.7.14 (from fabric)
  Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded
  Running setup.py Egg_info for package ssh
Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric)
  Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded
  Running setup.py Egg_info for package pycrypto
Installing collected packages: fabric, ssh, pycrypto
  Running setup.py install for fabric
    warning: no previously-included files matching '*' found under directory 'docs/_build'
    warning: no files found matching 'fabfile.py'
    Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin
  Running setup.py install for ssh
  Running setup.py install for pycrypto
...
Successfully installed fabric ssh pycrypto
Cleaning up...

しかし、これはほとんど表面的なものです:sshはparamikoのフォークであり、両方のライブラリのメンテナーは同じです(Jeff Forcier、Fabricの作者でもあります)、そして paramiko という名前のssh。 ( pbanka による修正)

60
hughdbrown

余分なモジュールを避けたい場合は、サブプロセスモジュールを使用して実行できます

ssh [Host] [command]

出力をキャプチャします。

次のようなものを試してください:

process = subprocess.Popen("ssh example.com ls", Shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output

ユーザー名とパスワードを処理するには、サブプロセスを使用してsshプロセスと対話するか、サーバーに公開キーをインストールしてパスワードプロンプトを回避することができます。

24
Neil

libssh2のPythonバインディング と書きました。 Libssh2は、SSH2プロトコルを実装するクライアント側のライブラリです。

import socket
import libssh2

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('exmaple.com', 22))

session = libssh2.Session()
session.startup(sock)
session.userauth_password('john', '******')

channel = session.channel()
channel.execute('ls -l')

print channel.read(1024)
17
Sebastian Noack

ここでは「最も単純な」の定義が重要です-単純なコードはモジュールを使用することを意味します(ただし、「大きな外部ライブラリ」は誇張されています)。

最新の(積極的に開発された)モジュールは paramiko であると思います。ダウンロードにはデモスクリプトが含まれており、詳細なオンラインAPIドキュメントがあります。 pexpect に含まれている PxSSH を試すこともできます。最初のリンクには、短いサンプルとドキュメントがあります。

繰り返しますが、単純さに関しては、適切なエラー検出は常にコードをより複雑に見せることになりますが、サンプルスクリプトから多くのコードを再利用し、それを忘れることができるはずです。

8
Cascabel

ヒュードブラウンのように、私はファブリックが好きです。 (デプロイなどを行うための)独自の宣言型スクリプトを実装する一方で、Pythonモジュールとしてインポートし、Fabricスクリプトを作成せずにプログラムで使用できることに注意してください。

ファブリックには新しいメンテナーがいて、書き換え中です。つまり、Web上で(現在)見つけるほとんどのチュートリアルは、現在のバージョンでは動作しません。また、Googleは最初の結果として古いFabricページを引き続き表示します。

最新のドキュメントについては、次を確認できます。 http://docs.fabfile.org

6
juanjux

Paramikoが少し低すぎることがわかり、Fabricはライブラリとして使用するのに特に適していないので、paramikoを使用して少し優れたものを実装する spur という独自のライブラリをまとめましたインタフェース:

import spur

Shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = Shell.run(["echo", "-n", "hello"])
print result.output # prints hello

また、実行中のプログラムの出力を印刷することもできます。これは、終了前に長時間実行されるコマンドの出力を確認したい場合に便利です。

result = Shell.run(["echo", "-n", "hello"], stdout=sys.stdout)
6

python sshサンプルのグーグルでここにアクセスする人のために。元の質問と回答は、ほとんど解読されていません。 paramikoには多少の機能が追加されているようです(わかりました-ここでは純粋に推測します-Pythonは初めてです)。paramikoで直接sshクライアントを作成できます。

import base64
import paramiko

client = paramiko.SSHClient()

client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.1', username='user', password='password')
stdin, stdout, stderr = client.exec_command('cat /proc/meminfo')
for line in stdout:
    print('... ' + line.strip('\n'))
client.close()

このコードは、 https://github.com/paramiko/paramiko のデモから採用されたものです。

3
oceanuz

please refer to paramiko.org, its very useful while doing ssh using python.

インポートパラミコ

輸入時間

ssh = paramiko.SSHClient()#SSHClient()はparamikoオブジェクトです

'' '以下の行はサーバーキーをknow_hostsファイルに自動的に追加します。以下のいずれかを使用してください' '' '

ssh.load_system_Host_keys()

ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())

試してください:

ここでは、実際にサーバーに接続しています。

ssh.connect('10.106.104.24', port=22, username='admin', password='')

time.sleep(5)

I have mentioned time because some servers or endpoint prints there own information after loggin in e.g. the version, model and uptime information, so its better to give some time before executing the command.

Here we execute the command, stdin for input, stdout for output, stderr for error

stdin, stdout, stderr = ssh.exec_command('xstatus Time')

ここでは、出力から行を読み取ります。

output = stdout.readlines() 

print(output)

Below all are the Exception handled by paramiko while ssh. Refer to paramiko.org for more information about exception.

(BadHostKeyException、AuthenticationException、
SSHException、socket.error)e:

print(e)
1
Harshan Gowda

これは私のために働いた

import subprocess
import sys
Host="IP"
COMMAND="ifconfig"

def passwordless_ssh(Host):
        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
                return "error"
        else:
                return result
1
Naveen

spurplus 、リモートマシンを管理しファイル操作を実行するために開発した spur および paramiko のラッパーをご覧ください。

Spurplusは、すぐに使用可能なcheck_output()関数を提供します。

import spurplus
with spurplus.connect_with_retries(
        hostname='some-machine.example.com', username='devop') as Shell:
     out = Shell.check_output(['/path/to/the/command', '--some_argument']) 
     print(out)
0
marko.ristin