Python ssh到aws服务器并编辑主机文件
我的代码: 出于某种原因,这似乎是无限循环并重复打印“here2”和“ls-lah”的输出。是不是有什么非常明显的事情我做错了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
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