Python ssh到aws服务器并编辑主机文件

Python ssh到aws服务器并编辑主机文件,python,python-2.7,amazon-web-services,ssh,boto,Python,Python 2.7,Amazon Web Services,Ssh,Boto,我的代码: 出于某种原因,这似乎是无限循环并重复打印“here2”和“ls-lah”的输出。是不是有什么非常明显的事情我做错了 def update_hosts_file(public_dns,hosts_file_info): for dns in public_dns: print 'here2' ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.Au

我的代码:

出于某种原因,这似乎是无限循环并重复打印“here2”和“ls-lah”的输出。是不是有什么非常明显的事情我做错了

def update_hosts_file(public_dns,hosts_file_info):
    for dns in public_dns:
        print 'here2'
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # wont require saying 'yes' to new fingerprint
        key_path = os.path.join(os.path.expanduser(KEY_DIR), KEY_NAME)+'.pem'
        ssh.connect(dns,username='ubuntu',key_filename=key_path)
        ssh.exec_command('touch testing')
        a,b,c=ssh.exec_command("ls -lah")
        print b.readlines()
        a,b,c=ssh.exec_command("file = open('/home/ubuntu/hosts', 'w')")
        #print b.readlines()
        ssh.exec_command("file.write('127.0.0.1 localhost\n')")
        for tag,ip in hosts_file_info.iteritems():
            ssh.exec_command("file.write('%s %s\n' % (ip,tag))")
        ssh.exec_command("file.close()")
        ssh.close()

public_dns = 'ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com'
print public_dns
hosts_file_info = {}
#hosts_file_info['1']='test'
#hosts_file_info['2']='test2'
#hosts_file_info['3']='test3'
#print hosts_file_info
update_hosts_file(public_dns,hosts_file_info)

您正在遍历public_dns变量中的每个字母。你可能想要这样的东西:

public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']
public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']

您正在遍历public_dns变量中的每个字母。你可能想要这样的东西:

public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']
public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']

第一个问题是
public\u dns
是一个字符串,因此
对于public\u dns中的dns:
将迭代该字符串的字符。您将使用
'e'
尝试代码,然后使用
'c'
,然后使用
'2'
,依此类推。这不是一个无限循环,但它是一个长度为42的循环,我很容易看到你感到厌烦,并在结束之前取消它

如果您只需要一台服务器,您仍然需要一个字符串列表,只是列表中只有一个字符串,如下所示:

public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']
public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']


下一个问题是您的ssh代码没有任何意义。您试图执行Python语句,比如
file=open('/home/ubuntu/hosts','w')
,就好像它们是bash命令一样。在bash中,该命令是一个语法错误,因为在shell脚本中不能以这种方式使用括号。如果您解决了这个问题,只需调用
file
命令,它就会抱怨找不到名为
=
的文件。您可以将一个Python脚本上载到删除服务器,然后运行它,通过
嵌入一个脚本。您的第一个问题是
public\u dns
是一个字符串,因此
for dns in public\u dns:
将迭代该字符串的字符。您将使用
'e'
尝试代码,然后使用
'c'
,然后使用
'2'
,依此类推。这不是一个无限循环,但它是一个长度为42的循环,我很容易看到你感到厌烦,并在结束之前取消它

如果您只需要一台服务器,您仍然需要一个字符串列表,只是列表中只有一个字符串,如下所示:

public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']
public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com']


下一个问题是您的ssh代码没有任何意义。您试图执行Python语句,比如
file=open('/home/ubuntu/hosts','w')
,就好像它们是bash命令一样。在bash中,该命令是一个语法错误,因为在shell脚本中不能以这种方式使用括号。如果您解决了这个问题,只需调用
file
命令,它就会抱怨找不到名为
=
的文件。您可以将一个Python脚本上传到remove服务器,然后运行它,通过
嵌入一个脚本。看起来您正在尝试执行Python语句,就像它们是bash命令一样,比如
file=open('/home/ubuntu/hosts','w')
。我不确定这是否会给您带来bash语法错误,或者来自
文件的错误,比如
无法打开“=”(没有这样的文件)
,但我确定它不会做任何有用的事情。顺便说一句,请查看Fabric。这使得很多这种类型的自动化变得简单和方便。看起来您正在尝试执行Python语句,就像它们是bash命令一样,比如
file=open('/home/ubuntu/hosts','w')
。我不确定这是否会给您带来bash语法错误,或者来自
文件的错误,比如
无法打开“=”(没有这样的文件)
,但我确定它不会做任何有用的事情。顺便说一句,请查看Fabric。这使得很多这种类型的自动化变得简单和方便。谢谢,伙计,我不知道我可以像那样使用sftp谢谢,伙计,我不知道我可以像那样使用sftp