python 获取ssh响应吗

python 获取ssh响应吗,第1张

最近在做一个项目,需要在客户端集成一个交互式ssh功能,大概就是客户端跟服务器申请个可用的机器,服务端返回个ip,端口,密码, 然后客户端就可以直接登录到机器上 *** 做了。该程序基于paramiko模块。

经查找,从paramiko的源码包demos目录下,可以看到交互式shell的实现,就是那个demopy。但是用起来有些bug,于是我给修改了一下interactivepy(我把windows的代码删掉了,剩下的只能在linux下用)。代码如下:

[python] view plain copy

#coding=utf-8

import socket

import sys

import os

import termios

import tty

import fcntl

import signal

import struct

import select

now_channel = None

def interactive_shell(chan):

posix_shell(chan)

def ioctl_GWINSZ(fd):

try:

cr = structunpack('hh', fcntlioctl(fd, termiosTIOCGWINSZ,'aaaa'))

except:

return

return cr

def getTerminalSize():

cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)

return int(cr[1]), int(cr[0])

def resize_pty(signum=0, frame=0):

width, height = getTerminalSize()

if now_channel is not None:

now_channelresize_pty(width=width, height=height)

def posix_shell(chan):

global now_channel

now_channel = chan

resize_pty()

signalsignal(signalSIGWINCH, resize_pty) # 终端大小改变时,修改pty终端大小

stdin = osfdopen(sysstdinfileno(), 'r', 0) # stdin buff置为空,否则粘贴多字节或者按方向键的时候显示不正确

fd = stdinfileno()

oldtty = termiostcgetattr(fd)

newtty = termiostcgetattr(fd)

newtty[3] = newtty[3] | termiosICANON

try:

termiostcsetattr(fd, termiosTCSANOW, newtty)

ttysetraw(fd)

ttysetcbreak(fd)

chansettimeout(00)

while True:

try:

r, w, e = selectselect([chan, stdin], [], [])

except:

# 解决SIGWINCH信号将休眠的select系统调用唤醒引发的系统中断,忽略中断重新调用解决。

continue

if chan in r:

try:

x = chanrecv(1024)

if len(x) == 0:

print 'rn EOFrn',

break

sysstdoutwrite(x)

sysstdoutflush()

except sockettimeout:

pass

if stdin in r:

x = stdinread(1)

if len(x) == 0:

break

chansend(x)

finally:

termiostcsetattr(sysstdin, termiosTCSADRAIN, oldtty)

使用示例:

[python] view plain copy

#coding=utf8

import paramiko

import interactive

#记录日志

paramikoutillog_to_file('/tmp/aaa')

#建立ssh连接

ssh=paramikoSSHClient()

sshload_system_host_keys()

sshset_missing_host_key_policy(paramikoAutoAddPolicy())

sshconnect('192168111',port=22,username='hahaha',password='',compress=True)

#建立交互式shell连接

channel=sshinvoke_shell()

#建立交互式管道

interactiveinteractive_shell(channel)

#关闭连接

channelclose()

sshclose()

interactivepy代码中主要修复了几个问题:

1、当读取键盘输入时,方向键会有问题,因为按一次方向键会产生3个字节数据,我的理解是按键一次会被select捕捉一次标准输入有变化,但是我每次只处理1个字节的数据,其他的数据会存放在输入缓冲区中,等待下次按键的时候一起发过去。这就导致了本来3个字节才能完整定义一个方向键的行为,但是我只发过去一个字节,所以终端并不知道我要干什么。所以没有变化,当下次触发按键,才会把上一次的信息完整发过去,看起来就是按一下方向键有延迟。多字节的粘贴也是一个原理。解决办法是将输入缓冲区置为0,这样就没有缓冲,有多少发过去多少,这样就不会有那种显示的延迟问题了。

2、终端大小适应。paramikochannel会创建一个pty(伪终端),有个默认的大小(width=80, height=24),所以登录过去会发现能显示的区域很小,并且是固定的。编辑vim的时候尤其痛苦。channel中有resize_pty方法,但是需要获取到当前终端的大小。经查找,当终端窗口发生变化时,系统会给前台进程组发送SIGWINCH信号,也就是当进程收到该信号时,获取一下当前size,然后再同步到pty中,那pty中的进程等于也感受到了窗口变化,也会收到SIGWINCH信号。

3、读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。ssh通道属于这一类的。本来进程因为网络没有通信,select调用为阻塞中的状态,但是当终端窗口大小变化,接收到SIGWINCH信号被唤醒。此时select会出现异常,触发系统中断(4, 'Interrupted system call'),但是这种情况只会出现一次,当重新调用select方法又会恢复正常。所以捕获到select异常后重新进行select可以解决该问题。

linux# ifconfig -a

windows#ipconfig /all

#ps -e|grep ssh

运行后如果有结果显示就说明ssh服务开启,如果没有结果,运行:

service sshd start

或者service ssh start

如果系统提示unreconize service

#apt install openssh-client

#apt install openssh-server

安装以上deb包以后#service sshd/ssh start

启动服务以后远程未必能直接ssh ,需要修改sshd_config文件把默认passwordauthentication设置为yes(因为win10:ubuntu默认no)

以下为配置步骤,请参考:

刚解决此问题,纠结了一段时间,现给你解答:

#cd /etc/ssh/

#vim sshd_config

修改如下:

#PasswordAuthentication no

改为:

PasswordAuthentication yes

(注意前面的 # 去掉)

保存文件后记得:service ssh restart

(只有重启服务才能让配置生效嘛,hahahia)

课后问题总结:

遇到此问题由于对ssh配置不熟悉,一度以为是:防火墙、服务企停、ssh/sshd安装包等等bug导致,经历一系列lab后,把/etc/ssh/sshd_config文件与正常的ubuntu配置文件比对后发现问题根源(原来就是win10:ubuntu 虚机默认密码认证是关闭状态),通过开启此配置解决问题。

方法/步骤首先,先要获取到Linux的端的IP地址,进行查看ip地址的方式,可以直接命令行中直接输入ifconfig,就可以查看到ip地址信息。然后可以从网上下载一个为ssh的客户端,下载完成后puttyexe的应用程序,直接双击这个应用程序即可。这样就直接进入到putty客户端的界面中,在hostname输入刚才记录的ip地址信息。输入完成之后,这样就可以直接连接Linux的服务器中了,但还不能 *** 作,需要先登录账号,loginas中输入Linux的用户名还需要账号的密码,直接输入密码,然后回车。这样就直接ssh客户端可以直接 *** 作远程中Linux服务器了。

改写为:(nohup/a)&(nohup/b)&(nohup/c)&wait说明:开启三个子shell在后台执行 *** 作,()表示开启子shell,若不加圆括号直接这样写,则直接在父shell *** 作,可能造成逻辑错误,因为这个不是在命令行执行的进程,wait根据实际情况添加,表示等前面三个进程执行结束在进行下一步

以上就是关于python 获取ssh响应吗全部的内容,包括:python 获取ssh响应吗、ubuntu使用ssh登陆时,如何能获得登陆终端的ip(急)、如何使用ssh登录linux服务器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9291372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存