【问题标题】:How to execute a script remotely in Python using SSH?如何使用 SSH 在 Python 中远程执行脚本?
【发布时间】:2012-02-05 16:02:34
【问题描述】:
def execute(self,command):
            to_exec = self.transport.open_session()
            to_exec.exec_command(command)
            print 'Command executed'
connection.execute("install.sh")

当我检查远程系统时,我发现脚本没有运行。有什么线索吗?

【问题讨论】:

  • 更多代码,请。没有足够的上下文。
  • 问题太模糊了,你使用的是哪个 ssh 包装器,错误是什么,你怎么知道“脚本没有运行”而不是“脚本运行但有错误”。
  • 我不知道您为什么要这样做,但如果是为了系统管理,您可能会发现 Fabric 很有用。
  • @charlax Fabric 是个好建议。 Fabric 的作者 Jeff Forcier 也是将 Paramiko 分叉到 ssh module 的人。我的回答解决了如何将ssh 与 python 一起使用的具体问题,但织物是处理@kevin 可能尝试解决的更普遍问题的更好方法。

标签: python shell ssh paramiko


【解决方案1】:
subprocess.Popen('ssh thehost install.sh')

查看subprocess 模块。

【讨论】:

  • 并确保您已生成 ssh 密钥,否则您的程序在从 cron 执行时将无法询问密码。
  • 最好使用ssh module,它旨在使其健壮且易于使用SSH协议;没有充分的理由使用subprocess 模块,因为它不仅更麻烦,而且您也不能依赖来自ssh 的返回代码,因为如果它返回错误代码 255,您将无法判断这是否是您的遥控器脚本返回,或者只是 ssh 由于与远程脚本完全无关的错误而返回代码。
【解决方案2】:

下面的代码会做你想做的事,你可以把它改成你的execute函数:

from paramiko import SSHClient
host="hostname"
user="username"
client = SSHClient()
client.load_system_host_keys()
client.connect(host, username=user)
stdin, stdout, stderr = client.exec_command('./install.sh')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()

但请注意,这些命令将默认为您的$HOME 目录,因此您需要在您的$PATH 中包含install.sh,或者(很可能)您需要在该目录中添加cd包含install.sh 脚​​本。

你可以检查你的默认路径:

stdin, stdout, stderr = client.exec_command('getconf PATH')
print "PATH: ", stdout.readlines()

但是,如果它不在您的路径中,您可以cd 并像这样执行脚本:

stdin, stdout, stderr = client.exec_command('(cd /path/to/files; ./install.sh)')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()

如果脚本不在 your$PATH 中,则需要使用 ./install.sh 而不是 install.sh,就像在命令行中一样。

如果您在完成上述所有操作后仍然遇到问题,也可以检查install.sh 文件的权限:

stdin, stdout, stderr = client.exec_command('ls -la install.sh')
print "permissions: ", stdout.readlines()

【讨论】:

  • 澄清一下,这个install.sh 脚本位于ssh 工作目录下的SSH 服务器上。运行 python 脚本的 SSH 客户端可能没有这个文件。有没有办法在服务器上运行在客户端上找到的 shell 脚本而不先复制它?
  • @jxramos 在客户端而不是远程主机上运行脚本的任何更新?
【解决方案3】:
ssh = paramiko.client.SSHClient()
ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
ssh.connect(hostname=host, username=username, password = password)
chan = ssh.invoke_shell()

def run_cmd(cmd):    
    print('='*30)
    print('[CMD]', cmd)
    chan.send(cmd + '\n')
    time.sleep(2)
    buff = ''
    while chan.recv_ready():
        print('Reading buffer')
        resp = chan.recv(9999)
        buff = resp.decode()
        print(resp.decode())

        if 'password' in buff:
            time.sleep(1)
            chan.send(password + '\n')        
        time.sleep(2)

    print('Command was successful: ' + cmd)

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 2020-01-06
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
相关资源
最近更新 更多