gpt4 book ai didi

python - 在远程机器上使用 Paramiko 通过 sshClient() 执行本地 python 脚本

转载 作者:太空狗 更新时间:2023-10-30 01:02:49 30 4
gpt4 key购买 nike

这是我在 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())

这是获取目录列表的函数:

获取目录.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 的 channel 的标准输出来列出留下脚本的目录,例如:

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

获取目录.py

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

但是有了这个,它实际上会尝试将本地目录列表作为命令运行(这实际上是有道理的)。我不得不将列表转换为字符串,因为我有一个 TypeError 说它需要一个字符串或只读字符缓冲区,而不是一个列表......我知道这是传递函数的绝望尝试......是否任何人都知道我怎么能做这样的事情(通过 paramiko 传递本地函数以在远程机器上执行它)?如果您对代码有任何更正或提示,我们非常欢迎(实际上,非常感谢任何形式的帮助!)。

提前致谢! :)

最佳答案

您不能只通过 ssh 执行 python 函数。 ssh 只是一个隧道,一侧(客户端)有您的代码,另一侧(服务器)有 shell。您应该在远程端执行 shell 命令。

如果使用原始 ssh 代码不是关键,我建议 fabric作为编写管理工具的库。它包含用于轻松处理 ssh、文件传输、sudo、并行执行等的工具。

关于python - 在远程机器上使用 Paramiko 通过 sshClient() 执行本地 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201624/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com