簡體   English   中英

在遠程機器上使用 Paramiko 通過 sshClient() 執行本地 python 腳本

[英]execute local python script over sshClient() with Paramiko in remote machine

這是我在 StackOverflow 上的第一篇文章,所以我希望以正確的方式來做! :)

我的新工作需要連接到多個服務器並在所有服務器中執行 python 腳本,我有這個任務要做。 我對服務器不是很熟悉(剛開始使用 paramiko),所以我為任何重大錯誤道歉!

我想在它們上運行的腳本修改了 authorized_keys 文件,但首先,我只在一台服務器上嘗試它,還沒有使用上述腳本(我不想犯錯誤並在我的第一個任務中阻止服務器!)。 我只是想用一個名為 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())

這是獲取目錄列表的函數:

獲取目錄

#!/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    

獲取目錄

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

但是有了這個,它實際上嘗試將本地目錄列表作為命令運行(這實際上是有道理的)。 我不得不將列表轉換為字符串,因為我有一個 TypeError 說它需要一個字符串或一個只讀字符緩沖區,而不是一個列表......我知道這是傳遞函數的絕望嘗試......是否有誰知道我怎么做這樣的事情(通過 paramiko 傳遞一個本地函數以在遠程機器上執行它)? 如果您對代碼有任何更正或提示,我們非常歡迎(實際上,任何形式的幫助都將不勝感激!)。

非常感謝! :)

你不能只通過 ssh 執行 python 函數。 ssh 只是一個隧道,你的代碼在一側(客戶端)和外殼在另一側(服務器)。 您應該在遠程端執行 shell 命令。

如果使用原始 ssh 代碼並不重要,我建議使用fabric作為編寫管理工具的庫。 它包含用於輕松處理 ssh、文件傳輸、sudo、並行執行等的工具。

我想你可能想改變你傳遞給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 實用程序,因此您實際上可以使用它來將腳本放在服務器上然后執行它。

可以通過使用 here 文檔將模塊提供給遠程服務器的 python 解釋器來做到這一點。

remotepypath = "/usr/bin/"

# open the module as a text file
with open("getDir.py", "r") as f:
    mymodule = f.read()

# setup from OP code
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)

# use here document to feed module into python interpreter
stdin, stdout, stderr = ssh.exec_command("{p}python - <<EOF\n{s}\nEOF".format(p=remotepypath, s=mymodule))
print("stderr: ", stderr.readlines())
print("stdout: ", stdout.readlines())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM