これは StackOverflow での最初の投稿なので、正しい方法で投稿したいと思っています! :)
複数のサーバーに接続し、すべてのサーバーで python スクリプトを実行する必要がある新しいジョブのために、このタスクを実行する必要があります。私はサーバーにあまり詳しくない (そして paramiko を使い始めたばかり) ので、大きな間違いがあれば申し訳ありません。
それらで実行したいスクリプトはauthorized_keysファイルを変更しますが、開始するには、1つのサーバーのみで試しており、前述のスクリプトをまだ使用していません(最初のタスクで間違いを犯してサーバーをブロックしたくありません!)。getDir() という非常に単純な関数を使用して、リモート マシンのディレクトリを一覧表示しようとしています。これまでのところ、基本を使用してparamikoでサーバーに接続できました(ちなみに、pdbを使用してスクリプトをデバッグしています):
try_paramiko.py
#!/usr/bin/python
import paramiko
from getDir import get_dir
import pdb
def try_this(server):
pdb.set_trace()
ssh = paramiko.SSHClient()
ssh.load_host_keys("pth/to/known_hosts")
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
my_key = paramiko.RSAKey.from_private_key_file("pth/to/id_rsa")
ssh.connect(server, username = "root", pkey = my_key)
i, o, e = ssh.exec_command(getDir())
これは、ディレクトリ リストを取得する関数です。
getDir.py
#!/usr/bin/python
import os
import pdb
def get_dir():
pdb.set_trace()
print "Current dir list is:"
for item in os.listdir(os.getcwd()):
print item
デバッグ中に、リモート マシンのディレクトリ リストではなく、ローカル マシンのディレクトリ リストを取得しました... paramiko を介して Python 関数をパラメーターとして渡す方法はありますか? スクリプトをローカルに置いて、sshのbashファイルで実行するときのようにリモートで実行したい:
ssh -i pth/to/key username@domain.com 'bash -s' < script.sh
したがって、実際にpythonスクリプトをすべてのマシンにコピーしてから実行することを避けるために(上記のコマンドを使用すると、スクリプトもリモートマシンにコピーされてから削除されると思いますよね?)それを行う方法はありますか? paramiko.sshClient()?
また、コードを変更し、exec_command を作成するチャネルの標準出力を使用してディレクトリを一覧表示し、次のようなスクリプトを残そうとしました。
try_paramiko.py
#!/usr/bin/python
import paramiko
from getDir import get_dir
import pdb
def try_this(server):
pdb.set_trace()
ssh = paramiko.SSHClient()
ssh.load_host_keys("pth/to/known_hosts")
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
my_key = paramiko.RSAKey.from_private_key_file("pth/to/id_rsa")
ssh.connect(server, username = "root", pkey = my_key)
i, o, e = ssh.exec_command(getDir())
for line in o.readlines():
print line
for line in e.readlines():
print line
getDir.py
def get_dir():
return ', '.join(os.listdir(os.getcwd()))
しかし、これにより、実際にはローカルディレクトリリストをコマンドとして実行しようとします(これは、実際に私が持っている方法で理にかなっています)。リストではなく、文字列または読み取り専用の文字バッファーが必要であるという TypeError が発生していたため、リストを文字列に変換する必要がありました...これは関数を渡すための必死の試みであったことはわかっています...私がそのようなことを行う方法を知っている人はいますか(paramikoを介してローカル関数を渡し、リモートマシンで実行します)? コードの修正やヒントがあれば、大歓迎です (実際、どんな種類の助けも大歓迎です!)。
よろしくお願いします!:)