コマンドを実行するために、Ubuntuでpythonでプログラムを作成していますls -l
RaspberryPiで、ネットワークに接続します。
誰も私がそれをどのように行うかについて私を導くことができますか?
もちろん、いくつかの方法があります!
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
...
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を介して接続し、コマンドを実行し、出力を返します。サードパーティのライブラリは必要ありません。
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')