web-dev-qa-db-ja.com

Pythonでリモートマシンでコマンドを実行する

コマンドを実行するために、Ubuntuでpythonでプログラムを作成していますls -l RaspberryPiで、ネットワークに接続します。

誰も私がそれをどのように行うかについて私を導くことができますか?

16
Irfan Ghaffar7

もちろん、いくつかの方法があります!

raspberry.lanホストにRaspberry Piがあり、ユーザー名がirfanであるとします。

サブプロセス

コマンドを実行するのはデフォルトのPythonライブラリです。
sshを実行させ、リモートサーバーで必要なことを実行できます。

それは彼の答えでカバーされていますか 。サードパーティのライブラリを使用したくない場合は、必ずこれを行う必要があります。

pexpect を使用して、パスワード/パスフレーズの入力を自動化することもできます。

パラミコ

paramiko はSSHプロトコルサポートを追加するサードパーティライブラリであるため、SSHクライアントのように機能します。

サーバーに接続し、ls -lコマンドの結果を実行して取得するサンプルコードは次のようになります。

import paramiko

client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('raspberry.lan', username='irfan', password='my_strong_password')

stdin, stdout, stderr = client.exec_command('ls -l')

for line in stdout:
    print line.strip('\n')

client.close()

ファブリック

fabric を使用して達成することもできます。
Fabricは、リモートサーバーでさまざまなコマンドを実行する展開ツールです。

多くの場合、リモートサーバーでの処理に使用されるため、1つのコマンドでWebアプリケーションの最新バージョンを簡単に配置し、Webサーバーなどを再起動できます。実際、複数のサーバーで同じコマンドを実行できます。これは素晴らしいことです!

展開およびリモート管理ツールとして作成されましたが、基本的なコマンドを実行するために引き続き使用できます。

# fabfile.py
from fabric.api import *

def list_files():
    with cd('/'):  # change the directory to '/'
        result = run('ls -l')  # run a 'ls -l' command
        # you can do something with the result here,
        # though it will still be displayed in fabric itself.

リモートサーバーでcd /ls -lを入力するようなものなので、ルートフォルダー内のディレクトリのリストを取得します。

次に、シェルで実行します。

fab list_files

サーバーアドレスの入力を求めます:

No hosts found. Please specify (single) Host string for connection: [email protected]

簡単なメモfabコマンドでユーザー名とホストを割り当てることもできます:

fab list_files -U irfan -H raspberry.lan

または、fabfileのenv.hosts変数にホストを配置できます。 方法は次のとおりです


次に、SSHパスワードの入力を求められます。

[[email protected]] run: ls -l
[[email protected]] Login password for 'irfan':

そして、コマンドは正常に実行されます。

[[email protected]] out: total 84
[[email protected]] out: drwxr-xr-x   2 root root  4096 Feb  9 05:54 bin
[[email protected]] out: drwxr-xr-x   3 root root  4096 Dec 19 08:19 boot
...
36
000

here の簡単な例:

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

それはまさにあなたが望むことをします:sshを介して接続し、コマンドを実行し、出力を返します。サードパーティのライブラリは必要ありません。

12
sashab

Linux/Unixの組み込みsshコマンドで以下の方法を使用できます。

   import os
   os.system('ssh username@ip  bash < local_script.sh >> /local/path/output.txt 2>&1')
   os.system('ssh username@ip  python < local_program.py >> /local/path/output.txt 2>&1')
1
Sagar Jagnade