7

これは 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を介してローカル関数を渡し、リモートマシンで実行します)? コードの修正やヒントがあれば、大歓迎です (実際、どんな種類の助けも大歓迎です!)。

よろしくお願いします!:)

4

3 に答える 3

5

sshを介してPython関数を実行することはできません。sshは、一方の側(クライアント)にコードがあり、もう一方の側(サーバー)にシェルがある単なるトンネルです。リモート側でシェルコマンドを実行する必要があります。

生のsshコードを使用することが重要でない場合は、fabric管理ツールを作成するためのライブラリとして提案します。簡単なssh処理、ファイル転送、sudo、並列実行などのツールが含まれています。

于 2012-11-02T19:38:21.593 に答える
2

渡すパラメーターを変更したい場合があると思います。ssh.exec_commandここにアイデアがあります:

代わりに:

def get_dir():
    return ', '.join(os.listdir(os.getcwd()))

i, o, e = ssh.exec_command(getDir())

あなたは試してみたいかもしれません:

i, o, e = ssh.exec_command('pwd')
o.printlines()

その他の調査事項:

  • サーバー上にある bash スクリプトまたは Python を作成します。Paramiko を使用してサーバーにログオンし、ssh.exec_command(some_script.sh)またはでスクリプトを実行できます。ssh.exec_command(some_script.py)
  • Paramiko には FTP/SFTP ユーティリティがいくつかあるので、実際にそれを使用してスクリプトをサーバーに配置し、実行することができます。
于 2012-11-19T19:16:15.197 に答える