paramiko 执行多条语句时,get_pty=True参数的使用

本文介绍了解决SSH远程连接中多条命令无法全部执行的问题。通过调整Python代码中的参数配置,确保了诸如文件复制、路径切换及文件解压等操作能够顺利进行。
AI助手已提取文章相关产品:

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

definstall_pkg(ip_list, copy_file_path, copy_to_path, cada_env_name):for pkg_ip in ip_list:
        print("pkg install on: ", pkg_ip)
        cmd = ""
        cmd += f"scp -r {copy_file_path} root@{pkg_ip}:{copy_to_path}; "
        print("cmd: ", cmd)
        os.system(cmd)
        print("Copy file complete!")
        time.sleep(2)
        ssh_remote = paramiko.SSHClient()
        ssh_remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_remote.connect(hostname=pkg_ip,
                           port=22,
                           username=username,
                           password=password)

        remote_cmd = ""
        remote_cmd += f"cp -r {copy_to_path}/{cada_env_name} /root/miniconda3/envs/; "
        remote_cmd += f"cd /root/miniconda3/envs/; "
        remote_cmd += f"tar -vxf {cada_env_name}; "
        print("install whl cmd is : ", remote_cmd)
        try:
            stdin, stdout, stderr = ssh_remote.exec_command(remote_cmd)
            print(stdout.readlines())
        except Exception as e:
            print("if exception is timeout, that's fine")
            print("exception is : ", e)
        finally:
            ssh_remote.close()
        print("install pkg on : ", pkg_ip)复制

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

definstall_pkg(ip_list, copy_file_path, copy_to_path, cada_env_name):for pkg_ip in ip_list:
        print("pkg install on: ", pkg_ip)
        cmd = ""
        cmd += f"scp -r {copy_file_path} root@{pkg_ip}:{copy_to_path}; "
        print("cmd: ", cmd)
        os.system(cmd)
        print("Copy file complete!")
        time.sleep(2)
        ssh_remote = paramiko.SSHClient()
        ssh_remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_remote.connect(hostname=pkg_ip,
                           port=22,
                           username=username,
                           password=password,
                           look_for_keys=True)

        remote_cmd = ""
        remote_cmd += f"cp -r {copy_to_path}/{cada_env_name} /root/miniconda3/envs/; "
        remote_cmd += f"cd /root/miniconda3/envs/; "
        remote_cmd += f"tar -vxf {cada_env_name}; "
        print("install whl cmd is : ", remote_cmd)
        try:
            stdin, stdout, stderr = ssh_remote.exec_command(remote_cmd, get_pty=True)
            print(stdout.readlines())
        except Exception as e:
            print("if exception is timeout, that's fine")
            print("exception is : ", e)
        finally:
            ssh_remote.close()
        print("install pkg on : ", pkg_ip)复制

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

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

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

您可能感兴趣的与本文相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值