Python远程linux执行命令实现

作者:业余DBA 时间:2023-11-17 14:48:14 

1、远程登录到linux上,使用到的模块paramiko


#远程登陆操作系统
def ssh(sys_ip,username,password,cmds):
 try
   #创建ssh客户端
   client = paramiko.SSHClient()
   #第一次ssh远程时会提示输入yes或者no
   client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
   #密码方式远程连接
   client.connect(sys_ip, 22, username=username, password=password, timeout=20)
   #互信方式远程连接
   #key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa")
   #ssh.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20)
   #执行命令
   stdin, stdout, stderr = ssh.exec_command(cmds[key])
   #获取命令执行结果,返回的数据是一个list
   result = stdout.readlines()
   return result
 except Exception, e:
   print e
 finally:
   client.close()

if __name__=="__main__":
 sys_ip = "192.168.0.102"
 username = "root"
 password = "1"
 cmds = "pwd"
 print ssh(sys_ip,username,password,cmds)

此处有个主意点,我遇到了,在密码登陆的时候,同样的python连接代码,放在python脚本里面执行就是报下面的错,但是将代码拷贝到python的交互模式下执行就是成功的,这个时候就是需要看下要远程的用户ssh配置是不是只支持键盘交互、密钥验证,如果是这样的话,使用密码远程登录就会报下面的错误

File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 337, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 528, in _auth
    raise saved_exception
AuthenticationException: Authentication failed.
 
  File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 337, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 528, in _auth
    raise saved_exception
paramiko.SSHException: No existing session

这个是因为linux会检测远程连接有没有tty(键盘交互),脚本方式运行的时候就没有键盘交互,看网上有在connect加,allow_agent=False,look_for_keys=False这2个参数解决的,但是我的没有解决,ssh.connect('localhost',username=name,password=pw,allow_agent=False,look_for_keys=False)

2、使用ssh,需要使用到shell命令expect

首先创建一个shell脚本remotExect.sh


#!/usr/bin/expect
set timeout 2
set local_file [lindex $argv 0]
set username  [lindex $argv 1]
set password  [lindex $argv 2]
set hostname  [lindex $argv 3]
set remote_file [lindex $argv 4]

spawn scp $local_file $username@$hostname:$remote_file
expect {
"yes/no"#是为了捕获首次登录,要手动输入yes/no的情况
{send "yes\r";}
"password:"#为例捕获需要输入密码的行为
{send "$password\r";}
}
expect eof

然后在python中执行


import os
cpFileCmd = "./remotecp.sh 1.txt root 1 192.168.0.102 /opt/1.txt"
os.system(cpFileCmd)

来源:https://blog.csdn.net/chenqiushi123/article/details/109608790

标签:Python,远程,linux,命令
0
投稿

猜你喜欢

  • Python try-except-else-finally的具体使用

    2022-10-18 14:31:45
  • Python数据可视化之Pyecharts使用详解

    2022-10-19 17:31:12
  • Django利用cookie保存用户登录信息的简单实现方法

    2021-03-22 16:47:26
  • Windows 系统下的 Git 2.7 最新下载及安装教程图文详解

    2022-02-07 01:08:47
  • MySQL学习之基础命令实操总结

    2024-01-16 17:27:32
  • Python的进制转换和ASCLL转换你了解吗

    2021-09-18 05:33:59
  • 端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!

    2023-08-23 06:29:31
  • python-itchat 获取微信群用户信息的实例

    2022-11-09 18:15:41
  • Python爬虫使用脚本登录Github并查看信息

    2022-05-02 13:09:28
  • 使用python实现mqtt的发布和订阅

    2021-04-16 12:27:53
  • SQL Server中使用DTS设计器进行数据转移

    2009-01-08 16:15:00
  • python根据文件名批量搜索文件

    2021-06-21 12:25:01
  • MybatisPlus二级缓存体系探究分析

    2022-12-24 00:42:26
  • Go语言Zap日志库使用教程

    2024-05-05 09:27:11
  • Python基于正则表达式实现检查文件内容的方法【文件检索】

    2021-06-11 07:58:45
  • Python通过Django实现用户注册和邮箱验证功能代码

    2021-02-21 13:59:03
  • 使用Python轻松完成垃圾分类(基于图像识别)

    2023-06-24 06:06:47
  • python包的导入方式总结

    2021-01-18 08:55:23
  • python输出第n个默尼森数的实现示例

    2022-08-12 21:07:25
  • python3爬虫中异步协程的用法

    2021-11-01 01:16:02
  • asp之家 网络编程 m.aspxhome.com