【发布时间】:2016-10-27 20:04:07
【问题描述】:
我目前正在编写一个脚本,当我启动一个 EC2 实例时,我会发送一个 paramiko 命令来重命名主机名。因为这是一个定制的 AMI,我不能使用 AWS Boto3 CLI 来做,所以我需要通过 SSH 命令来做。
我遇到的问题是 Paramiko 似乎无法通过我的特定命令。它会很好地传递其他命令,但我假设我遇到了 paramiko 或 python 的某种限制,并且似乎无法对其进行故障排除。这是针对 RHEL 实例的,因此重命名网络文件是我能想到的唯一方法。
如果我通过主机终端按原样运行命令,它就可以工作。所以 paramiko 和这个命令之间的东西似乎是阻碍。
这是我的示例脚本,它应该可以工作,但似乎无法运行该命令。
#!/usr/bin/env python
import boto3
import time
import subprocess
import paramiko
import StringIO
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect(hostname = '12.34.56.78', username = "username", key_filename='''/Users/mallachar/Downloads/testkey.pem''' )
stdin , stdout, stderr = c.exec_command('sudo sed -i -E "s/^HOSTNAME.*/HOSTNAME=testhost.company/" /etc/sysconfig/network')
print stdout.read()
print stderr.read()
c.close
这是我打印标准输出和标准错误
sudo: sorry, you must have a tty to run sudo
【问题讨论】:
-
您是否看到错误消息?
stdout或stderr是否包含任何内容?你可以运行任何命令(如echo)并看到一些东西吗? sudo 权限是否正确设置? exec 命令中的双引号是否有问题,也许它们需要转义? -
@Pyrce 这是我打印时得到的输出。
<paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0xc533310L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>><paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0xc533310L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>Out[16]: <bound method SSHClient.close of <paramiko.client.SSHClient object at 0x10c5331d0>> -
那些是标准输出和标准错误信息?那些看起来就像你打印的
c -
我更新了代码以显示我所做的。
-
为什么要对抽象的 python 部分进行讨论?当一个简单的 ssh -t -i /Users/mallachar/Downloads/testkey.pem username@12.34.56.78 "sudo sed ..." 等就可以了。 (ssh 命令的 -t 分配一个伪终端,因此 sudo 可以工作)。
标签: python linux bash sed paramiko