当前位置:   article > 正文

paramiko 执行多条语句时,get_pty=True参数的使用_paramiko 批量执行不同命令

paramiko 批量执行不同命令

ssh远程到其他机器上执行多条命令时,遇到有的命令不会执行成功,起初以为是远程过去执行命令的权限不够,不是以root用户的权限执行命令,所以在命令前加了sudo,发现依然不能全部执行成功,下面是最初执行的代码:

  1. definstall_pkg(ip_list, copy_file_path, copy_to_path, cada_env_name):for pkg_ip in ip_list:
  2. print("pkg install on: ", pkg_ip)
  3. cmd = ""
  4. cmd += f"scp -r {copy_file_path} root@{pkg_ip}:{copy_to_path}; "
  5. print("cmd: ", cmd)
  6. os.system(cmd)
  7. print("Copy file complete!")
  8. time.sleep(2)
  9. ssh_remote = paramiko.SSHClient()
  10. ssh_remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  11. ssh_remote.connect(hostname=pkg_ip,
  12. port=22,
  13. username=username,
  14. password=password)
  15. remote_cmd = ""
  16. remote_cmd += f"cp -r {copy_to_path}/{cada_env_name} /root/miniconda3/envs/; "
  17. remote_cmd += f"cd /root/miniconda3/envs/; "
  18. remote_cmd += f"tar -vxf {cada_env_name}; "
  19. print("install whl cmd is : ", remote_cmd)
  20. try:
  21. stdin, stdout, stderr = ssh_remote.exec_command(remote_cmd)
  22. print(stdout.readlines())
  23. except Exception as e:
  24. print("if exception is timeout, that's fine")
  25. print("exception is : ", e)
  26. finally:
  27. ssh_remote.close()
  28. print("install pkg on : ", pkg_ip)复制

上面这段代码执行的时候,不会执行最后一个解压命令:tar -vxf {cada_env_name};这个命令单执行的时候,文件解压会需要很长的时间。原因是由于如果直接写的话在每条命令后加分号执行时会报错,如果不加分号,分一条命令一条命令地执行,起不到作用,如切换路径等。经过百度,我在ssh的时候添加了look_for_keys=True和调用exec_command的时候加了get_pty=True就可以以成功执行所有命令了。下面是修改后的代码:

  1. definstall_pkg(ip_list, copy_file_path, copy_to_path, cada_env_name):for pkg_ip in ip_list:
  2. print("pkg install on: ", pkg_ip)
  3. cmd = ""
  4. cmd += f"scp -r {copy_file_path} root@{pkg_ip}:{copy_to_path}; "
  5. print("cmd: ", cmd)
  6. os.system(cmd)
  7. print("Copy file complete!")
  8. time.sleep(2)
  9. ssh_remote = paramiko.SSHClient()
  10. ssh_remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  11. ssh_remote.connect(hostname=pkg_ip,
  12. port=22,
  13. username=username,
  14. password=password,
  15. look_for_keys=True)
  16. remote_cmd = ""
  17. remote_cmd += f"cp -r {copy_to_path}/{cada_env_name} /root/miniconda3/envs/; "
  18. remote_cmd += f"cd /root/miniconda3/envs/; "
  19. remote_cmd += f"tar -vxf {cada_env_name}; "
  20. print("install whl cmd is : ", remote_cmd)
  21. try:
  22. stdin, stdout, stderr = ssh_remote.exec_command(remote_cmd, get_pty=True)
  23. print(stdout.readlines())
  24. except Exception as e:
  25. print("if exception is timeout, that's fine")
  26. print("exception is : ", e)
  27. finally:
  28. ssh_remote.close()
  29. print("install pkg on : ", pkg_ip)复制

关于这个两个参数的使用,百度以下说明仅供参考:

look_for_keys(bool类型): 默认为True,就是会找你 .ssh 目录下有没有合适的密钥文件;

get_pty(bool类型):实际在远程执行sudo命令时,一般主机都会需要通过tty才能执行,通过把get_pty值设置为True,可以模拟tty;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/603499
推荐阅读
相关标签
  

闽ICP备14008679号