python3交互模式_在Python3中使用paramiko模块实现交互式操作(简洁实战+总结)

我想实现的是:

使用服务器A 登录 服务器B,把服务器B的文件用SCP 发到服务器C中,因为有yes/no 的输入,不知道用paramiko模块实现?

我在服务器B中写了一个.sh用于测试:

study_shell.sh

#! /bin/bash

echo "hello, shell! 0130"

choice="null"

echo "${choice}"

read -p "Do you want to build dir?(yes/no): " choice

echo "${choice}"

if [ ${choice} == 'yes' ]

then

echo "OK, we choice yes"

mkdir we_choice_YES

else

echo "We not choice yes..."

mkdir we_not_choice_yes

fi

显然我们想实现选择 yes

我们在另外一台服务器执行:

import paramiko

import time

__author__ = 'weiran'

def test_paramiko_interact():

trans = paramiko.Transport(('10.46.169.111', 22)) # 【坑1】 如果你使用 paramiko.SSHClient() cd后会回到连接的初始状态

trans.start_client()

# 用户名密码方式

trans.auth_password(username='user', password='pwd')

# 打开一个通道

channel = trans.open_session()

channel.settimeout(7200)

# 获取一个终端

channel.get_pty()

# 激活器

channel.invoke_shell()

cmd = 'cd /home/shell_study\r'

# 发送要执行的命令

channel.send(cmd)

cmd = 'bash ./study_shell.sh\r' # 【坑2】 如果你使用 sh ./study_shell.sh\r 可能会出现 [: 11: y: unexpected operator 错误

channel.send(cmd)

# 回显很长的命令可能执行较久,通过循环分批次取回回显

while True:

time.sleep(0.2)

rst = channel.recv(1024)

rst = rst.decode('utf-8')

print(rst)

# 通过命令执行提示符来判断命令是否执行完成

if 'yes/no' in rst:

channel.send('yes\r') # 【坑3】 如果你使用绝对路径,则会在home路径建立文件夹导致与预期不符

time.sleep(0.5)

ret = channel.recv(1024)

ret = ret.decode('utf-8')

print(ret)

break

channel.close()

trans.close()

# channel.invoke_shell()

if __name__ == '__main__':

test_paramiko_interact()

参考:

这些链接作者都很牛,但有时我们往往只需要简单操作实现就行,有深入了解的小伙伴推荐看看~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值