当前位置:首页 » 编程语言 » pythonssh代理

pythonssh代理

发布时间: 2023-03-17 20:07:26

1. python用ssh连接时,只用ip和用户名但是不需要用到密码,该怎么编程

局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的。现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件,拷贝某些文件,批量关机等。如果一台一台得手工去操作,费时又费力,如果要进行多个操作就更麻烦啦。

或许你会想到网络同传, 网络同传是什么?就是在一台电脑上把电脑装好,配置好,然后利用某些软件,如“联想网络同传”把系统原样拷贝过去,在装系统时很有用,只要在一台电脑上装好,同传以后所有的电脑都装好操作系统了,很方便。同传要求所有电脑硬件完全相同,在联想的电脑上装的系统传到方正电脑上肯定会出问题的。传系统也是很费时间的,根据硬盘大小,如果30G硬盘,100多台电脑大约要传2个多小时,反正比一台一台地安装快!但是如果系统都传完了,发现忘了装一个软件,或者还需要做些小修改,再同传一次可以,但是太慢,传两次半天时间就没了。这时候我们可以利用ssh去控制每台电脑去执行某些命令。

先让我们回忆一下ssh远程登录的过程:首先执行命令 ssh [email protected] ,第一次登录的时候系统会提示我们是否要继续连接,我们要输入“yes”,然后等一段时间后系统提示我们输入密码,正确地输入密码之后我们就能登录到远程计算机,然后我们就能执行命令了。我们注意到这里面有两次人机交互,一次是输入‘yes’,另一次是输入密码。就是因为有两次交互我们不能简单的用某些命令去完成我们的任务。我们可以考虑把人机交互变成自动交互,python的pexpect模块可以帮我们实现自动交互。

2. 使用python 实现SSH登录设备时出现问题

解决了啊,不过不是用的
stdin,stdout,stderr=client.exec_command('show arp;show clock')
用这种方法只能弄一条命令
用下面这个
chan= client.invoke_shell()
chan.send('en\n')
chan.send("password\n")
chan.send('show log\n')
result = chan.recv(100000).decode()
用了这个可能还有别的问题,试试吧,不行再讨论

3. 求ssh代理设置方法

可以的 先ssh到b 在b中 shh c的地址的就可以了 相当你在b中进行操作了。

4. python 模拟 ssh 执行远程命令

日常开发连接 Linux 服务器,都会用到 ssh 客户端的软件
其实 python 有一个模块,可以简单模拟一个 ssh 客户端/服务端
编写一些自动化的的任务时,会经常和它打交道
简单记录一下 paramiko 的基本使用

paramiko 不是标准库,需要自行安装
要腔粗求 py2.7,3.4 版本以上 [1]

在得到一个 ssh_client 客户端连接对象后

第一次和服务器建立连接,需要选择是否自动将服务器的 host_key 公钥,记录在本地

因为,在计算机的世界里,没有永久的朋友-- IP 短时间里不会刷新,但是山颂系统可能随时被重置

否则会报错提示:

可以加入 logging 模块,查看详细的通讯过程

使用三个变量,获取返回的信息对象

读取命令的执行结伍唯镇果

5. 如何用python开发一个ssh客户端工具


1)通过paramiko的ssh模块连接指定主机;

2)通过SSHClient.exec_command在远程主机上执行命令;

3)通过exec_command返回的stdout,stdin,stderr进行交互;

4)保存成功连接的主机信息(session),可以通过ls命令查看,sessionid命令,直接启动新连接;

5)可在windows和linux下运行,写程序时需要注意他们的差别。
代码ssh.py

#!/usr/bin/python
#-*-coding:utf-8-*-

importos,sys
importparamiko
importthreading
importplatform

curr_ssh=None
curr_prompt=">>"

#使用说明
defprintUsage():
print"!ls:listsessions."
print"!sessionid:connectsession."
print"!connhostuserpassword:connecthostwithuser."
print"!exit:exit."

#连接
defconn(ip,username,passwd):
try:
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
print"Connectto",ip,"with",username
globalcurr_prompt
curr_prompt=username+"@"+ip+">>"
returnssh
except:
returnNone

#加载以前的连接信息
sessions=[]
defloadSessions():
globalsessions
try:
f=open("sessions")
sessions=f.readlines()
f.close()
except:
pass

#执行本地命令,ssh.py的命令
defexe_cmd_local(cmd):
if(cmd=="!ls"):
loadSessions()
globalsessions
i=0
print"Sessions:"
forsinsessions:
print"[%d]%s"%(i,s)
i+=1
else:
vals=cmd.split('')
if(vals[0]=="!session"):
id=(int)(vals[1])
if(id<len(sessions)):os_name="platform.system()"new_console_cmd=""if(os_name="=""linux"):="".=""ssh.py="""=""+=""sessions[id]+"""=""elif(os_name="=""windows"):=""sessions[id]=""os.system(new_console_cmd)=""else:=""print="""didn't=""hava=""sessoin=""",vals[1]=""elif(vals[0]="="!conn"):"global=""curr_ssh=""f="open("sessions","a")"line="vals[1]+"""+vals[2]+"="""+vals[3]+" "=""f.write(line)=""f.close()=""#在ssh连接的主机上执行命令=""def=""exe_cmd_ssh(ssh,cmd):=""if(ssh="="none):=""connect=""to=""a=""server.=""use=""'!conn'=""please."=""return=""stdin,=""stdout,=""stderr="ssh.exec_command(cmd)"#stdin.write("y")=""#简单交互,输入=""‘y’=""#屏幕输出=""stdout.read()=""stderr.read()=""#入口函数=""if=""__name__="='__main__':"loadsessions()=""if(len(sys.argv)="=4):"printusage()=""while=""true:=""cmd="raw_input(curr_prompt)"if(len(cmd)="=0):"continue=""if(cmd="=""!exit"):=""if(curr_ssh=""!="None):"curr_ssh.close();=""break=""if(cmd[0]="="'!'):=""exe_cmd_local(cmd)=""exe_cmd_ssh(curr_ssh,cmd)<=""pre="">

6. python 实现ssh的执行远端命令和scp的不同机器文件传输功能

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pexpect
def ssh_cmd(ip, passwd, cmd):
ret = -1
ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd))
try:
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes\n')
ssh.expect('password: ')
ssh.sendline(passwd)
ssh.sendline(cmd)
r = ssh.read()
print r
ret = 0
except pexpect.EOF:
print "EOF"
ssh.close()
ret = -1
except pexpect.TIMEOUT:
print "TIMEOUT"
ssh.close()
ret = -2
return ret

利用pexpect模块我们可以做很多事情,由于他提供了自动交互功能,因此我们可以实现ftp,telnet,ssh,scp等的自动登录,还是比较实用的。根据上面的代码相信读者已经知道怎么实现了(python就是那么简单!)。

上面的代码去完成任务还是比较费时间的,因为程序要等待自动交互出现,另外ubuntu用ssh连接就是比较慢,要进行一系列的验证,这样才体现出ssh
的安全。我们要提高效率,在最短的时间内完成。后来我发现了python里面的paramiko模块,用这个实现ssh登录更加简单。看下面的代码:

复制代码 代码如下:

#-*- coding: utf-8 -*-
#!/usr/bin/python
import paramiko
import threading
def ssh2(ip,username,passwd,cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
for m in cmd:
stdin, stdout, stderr = ssh.exec_command(m)
# stdin.write("Y") #简单交互,输入 ‘Y'
out = stdout.readlines()
#屏幕输出
for o in out:
print o,
print '%s\tOK\n'%(ip)
ssh.close()
except :
print '%s\tError\n'%(ip)
if __name__=='__main__':
cmd = ['cal','echo hello!']#你要执行的命令列表
username = "" #用户名
passwd = "" #密码
threads = [] #多线程
print "Begin......"
for i in range(1,254):
ip = '192.168.1.'+str(i)
a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))
a.start()

上面的程序还是有些技巧的:
1.
利用多线程,同时发出登录请求,同时去连接电脑,这样速度快很多,我试了一下,如果不用多线程,直接一个一个挨着执行的话,大约5~10秒钟才能对一台电
脑操作完,具体时间要根据命令的来决定,如果是软件安装或者卸载时间要更长一些。这样下来怎么也要一二十分钟,用多线程后就快多了,所有的命令执行完用了
不到2分钟!
2.最好用root用户登录,因为安装或者卸载软件的时候如果用普通用户又会提示输入密码,这样又多了一次交互,处理起来就比较麻
烦!安装软件时apt-get install xxx
最好加上“-y”参数,因为有时安装或删除软件时提示是否继续安装或卸载,这又是一次自动交互!加上那个参数后就没有人机交互了。
3. 循环时循环所有ip,因为计算机的ip是路由器自动分配的,保险起见,最好全部都执行,保证没有遗漏的主机
4.远端执行命令时如果有交互,可以这样用 stdin.write("Y")来完成交互,“Y”就是输入“Y”。
5.把所有的命令放到一个列表里面,遍历列表可以依次执行列表里面的命令
6.为了更好的进行控制,最好在电脑上提前把root用户打开,装好ssh服务器并让其开机自动执行。

7. SSH 通过代理连接服务器

老规矩,先说结论:

或者:

注意:由于 macOS 版 Ncat 的 7.90 和 7.91 版本的 bug,上述方式不再生效。起码 7.91 版本在 macOS 10.15.7 上是不行的。此问题在 7.92 版本中已经解决。

具体原因参见: https://nmap.org/changelog.html

但 Linux 上没问题。所以增加个 socat 的替补方案:

Scout 本身很强大,但对代理的支持这部分貌似差一些,只支持 SOCKSv4 和 HTTP Proxy,不灶穗陵支持 SOCKS5。详情参考 《socat 初窥门径》 。

有些时候,由于网络限制等原因,不能直接连通过 SSH 连到指定服务器,需要经过代理进行连接。例如如下场景:

其中,
client.net 不能直接访问 server.net
client.net 可以访问 proxy.net
proxy.net 可以访问 server.net

使用 SSH 的 ProxyCommand 选项,配合 nc/Ncat 命令,实现 client.net 通过代理 proxy.net ,以 SSH 访问 server.net 。

(1) nc

macOS 上常用这种方案。但是 nc 不支持需要认证的代理。

常用参数:

(2) Ncat

Ncat 在 macOS 上通过代理连接时会出现连接断开的情况。

常用参数:

以 nc 为例,如使用 Ncat 可以自行替换。

默认为 Socket5 代理,这时可以省略 -X 参数
或者采用另一种写法:

SSH 配置文件位置:

增加如下两行内容:以 nc 为例,如使用 Ncat 可以自行替换。

使用配置文件之后,就不需要在命令行中进行代理配置了。

对于大部分情况,都可以直接使用 nc 或者 Ncat 解决。但对于一些复杂情况,也可以通过其它方案完成。如在 macOS 上想通过需要认证的代理连接,用 nc 不支持代理认证, Ncat 又有些问题。

对于代理类型的族前问题,可以通过 Brook 来进行类型转换。

1、 corkscrew

只支持 HTTP 代理

如需要访问带认证的代理服务器

~/.ssh/myauth 的内容:

2、 proxytunnel

只支持 HTTP 代理

命令行里只填用户名,会提示输入密码,或者通过环隐戚境变量传入。

(完)

8. 请教下python3 上如何实现级联ssh

首先,我的windows系统上有python2和python3。使用下面命令切换到python3:

activate py3
1
接着使用下面命令下载相关模块:

pip install ecdsa
pip install Crypto
pip install paramiko
1
2
3
连接服务器操作:
# -*- coding: utf-8 -*-
import paramiko
# 服务器相关信息,下面输入你个人的用户名、密码、ip等信息
ip = ""
port = 22
user = ""
password = ""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 建立连接
ssh.connect(ip,port,user,password,timeout = 10)
#输入linux命令
stdin,stdout,stderr = ssh.exec_command("pwd")
# 输出命令执行结果
result = stdout.read()
print(result)
#关闭连接
ssh.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
如下,运行该程序,可以看到控制台输出的结果:

9. ssh的代理和端口转发机制介绍

本文介绍通过ssh建立隧道的三种方式。

ssh的隧道均通过端口转发来实现,包括三种模式早念:

MobaXterm作为一个良心的终端工具,在其MobaSSHTunnel菜单项可以帮助我们基于图形化的方式建立上述三种隧道,其提供的向导也能帮助我们更有效的理解和记住上面这3个参数。因此本文借用这些向导中的截图来进行说明。

实现功能:把ssh服务器能够访问的ip和端口映射到客户端的指定端口,这样在客户端网络内访问客户端的指定端口就能访问到ssh服务器所在网络中的服务。经常使用的场景是客户端自身通过localhost:<指定端口>去访问。

参数说明:

实现功能:把ssh客户端能访问到的ip和端口映射到ssh服务器的指定端口,这样在服务器端的网络内访问服务器的指定端口就能访问到ssh客户端算在网络中的服务。

参数说明:

动态端口转发实际上是陆蔽困本地端口转发的升级版,除了建立本地端口转发之外,这种模式还在ssh的通信两端启动了socks5代理服务,并且通过本地端口转发机制把两个socks5代理连接在一起,因此当访问本地的socks5服务时实际上也是在访问远并宏程的socks5服务。这样当指定客户端作为socks5代理之后,实际上相当于把客户端放入服务器端所在网络中,能够访问网络中的任意一个服务,而无需为每个服务(ip:端口)都配一次本地端口转发规则。

参数说明:

10. python的paramiko模块 支持连接交换机吗

paramiko使用

paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接、命令执行、文件传输、中间SSH代理功能

安装

pip install paramiko
或 easy_install paramiko
paramiko依赖第三方的Crypto,Ecdsa和pyhton-devel,所以需要安装

paramiko核心组件

SSHClient类

SSHClient类是SSH服务会话的高级表示,该类实现了传输、通道、以及SFTP的校验、建立的方法

  • connect 方法

    connect方法实现了远程ssh连接并作校验

  • hostname 连接的目标主机

  • port=SSH_PORT 指定端口

  • username=None 验证的用户名

  • password=None 验证的用户密码

  • pkey=None 私钥方式用于身份验证

  • key_filename=None 一个文件名或文件列表,指定私钥文件

  • timeout=None 可选的tcp连接超时时间

  • allow_agent=True, 是否允许连接到ssh代理,默认为True 允许

  • look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许

  • compress=False, 是否打开压缩

  • sock=None,

  • gss_auth=False,

  • gss_kex=False,

  • gss_deleg_creds=True,

  • gss_host=None,

  • banner_timeout=None

  • 参数

  • exec_command方法

    远程执行命令的方法,该命令的输入与输出流为标准输入、标出输出、标准错误输出

  • command 执行的命令

  • bufsize=-1 文件缓冲区大小

  • timeout=None

  • get_pty=False

  • 参数

  • load_system_host_key方法

    夹在本地公钥文件,默认为~/.ssh/known_hosts

  • filename=None 指定本地公钥文件

  • 参数

  • set_missing_host_key_policy方法
    设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:

    用法:
    set_missing_host_key_policy(paramiko.AutoAddPolicy())

  • AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认

  • WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接

  • RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

  • SFTPClient类

    SFTPCLient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态

  • from_transport(cls,t) 创建一个已连通的SFTP客户端通道

  • put(localpath, remotepath, callback=None, confirm=True) 将本地文件上传到服务器 参数confirm:是否调用stat()方法检查文件状态,返回ls -l的结果

  • get(remotepath, localpath, callback=None) 从服务器下载文件到本地

  • mkdir() 在服务器上创建目录

  • remove() 在服务器上删除目录

  • rename() 在服务器上重命名目录

  • stat() 查看服务器文件状态

  • listdir() 列出服务器目录下的文件

  • 远程连接并执行命令

    实现远程连接主机,并执行命令,同时记录日志
    * 直接验证方式


热点内容
动态规划01背包算法 发布:2024-11-05 22:17:40 浏览:846
nasm编译器如何安装 发布:2024-11-05 22:01:13 浏览:176
登录密码在微信的哪里 发布:2024-11-05 22:00:29 浏览:735
c防止反编译工具 发布:2024-11-05 21:56:14 浏览:243
安卓虚拟机怎么用 发布:2024-11-05 21:52:48 浏览:340
php时间搜索 发布:2024-11-05 20:58:36 浏览:475
燕山大学编译原理期末考试题 发布:2024-11-05 20:13:54 浏览:524
华为电脑出现临时服务器 发布:2024-11-05 20:05:08 浏览:405
斗战神免费挖矿脚本 发布:2024-11-05 19:53:25 浏览:662
网吧服务器分别是什么 发布:2024-11-05 19:45:32 浏览:390