澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

实现简单的ssh,socket实现简单ssh客户端

来源:http://www.bhtsgq.com 作者:计算机知识 人气:194 发布时间:2019-05-24
摘要:客户端代码,监听端口号为 localhost 999玖 假使你看过了上篇小说ssh达成轻便的多寡传输,那么完成轻便的ssh客户端也不是如何难题,无非正是在劳动器端利用os模块将客户端发来的音讯

  客户端代码,监听端口号为 localhost 999玖

假使你看过了上篇小说ssh达成轻便的多寡传输,那么完成轻便的ssh客户端也不是如何难题,无非正是在劳动器端利用os模块将客户端发来的音讯作为命令获取重返值,然后将重回值再发送给客户端,可是依旧有个别要小心的地点的,作者先贴出来代码,然后再说注意的地点

ssh客户端

ssh,配置文件:/etc/ssh/ssh_config

在布署文件/etc/ssh/ssh_config中Strict HostKey Checking no 首次登陆不出示检查提醒。

格式:ssh [user@]host IP地址 [command]

ssh [-l user]host IP地址 [command]

(假如不点名用户,你是哪些用户就总是哪个用户上,前面还可跟命令)

图片 1

 

Ssh客户端允许实现对长途系统经验证地加密安全访问

当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_实现简单的ssh,socket实现简单ssh客户端。ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下一次连连时,会自动相称相应私钥,不能够相配,将拒绝连接

 

上边来看一下ssh的一些选项:

-p port端口号:远程服务器监听的端口

比如:ssh 1玖二.16八.10.178 -p 222二若是将服务器的端口改为222二,再用ssh连接不点名端口(默许是2二端口),此时就不能连接,连接时内定端口号就能够接连了。

改端口号:semanage port -a -t ssh_port_t -p tcp 端口号 (要是启用了SELinux战略,改的端口号为非标准端口号,违反了SELinux攻略,直接改造配置文件是不得以的,要用这种艺术去修改,记得改完事后重启一下sshd服务)

图片 2

-b 钦定源IP来三番五次服务器

-v:调节和测试格局(连接的时候开掘有个别谬误,能够用-v来排错)

-C:压缩格局

-X: 支持x11转发

xclock命令在centos陆方面能够展开小电子石英表,在centos7上边打不开,将来自身用centso7去老是centos6,直接连接上去,实践xclock命令是打不开小石英手表的,需索要的价格格-X选项,才具展开

-Y:支持信任x1壹转账

ForwardX11Trusted yes

-t: 强制伪tty分配

 

小实验:

如图:假若集团内部有两台机器B,C,在那之中C是ssh service ,公司中间连接互连网是经过防火墙来三番五次的,只有B本事三番五次到C,A无法直接连接C,假若A出差了,在公司外部,现在A想要连接C,怎么着连接呢?A可以接连到B,通过B这么些跳板再来连接受C ssh -t B(ip地址) ssh C(ip地址)

图片 3

 

 

实验景况:有三台机器A,B,C,那三台机器都在八个网段中。

一)先在C机器上制定防火墙计谋,拒绝A机器连接iptables -A INPUT -s 192.168.10.13陆 -j REJECT

诸如此类A就不可能直接连接C了,,B能够连接C,A能够连接B,所以B能够做跳板,让A借助B来连接C

二)ssh -t 1九二.16八.10.13五 ssh 1九二.168.十.17捌 那样就能够接二连三了,需求输入五遍密码

图片 4

 

socket_server_ssh.py

#!/usr/local/bin/python3
# -*- coding:utf-8 -*-

import socket
client = socket.socket()

client.connect(('localhost', 9999))

while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:
        continue
    client.send(cmd.encode("utf-8"))
    cmd_res_size = client.recv(1024)    # 接收命令结果的长度
    print("命令结果大小:", cmd_res_size.decode())

    # 防止粘包-装逼方法
    client.send("接收成功".encode("utf-8"))

    # print(cmd_res)

    received_size = 0

    while received_size < int(cmd_res_size.decode()):

        data = client.recv(1024)
        received_size  = len(data)
        print(data.decode())
        print("-----%s-----" % len(data))
    else:
        print("received done...", cmd_res_size.decode())



client.close()

劳动器端

广阔的ssh连接难点

在用ssh连接的时候大家会遇到一些难点,接下去介绍一下那几个主题材料和平解决决这一个主题材料的方案

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

__author__ = "Samson"

import socket
import os

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("localhost",6969))
server.listen()
while True:
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        data = conn.recv(1024)
        if not data:
            print("客户端已断开!")
            break
        print("执行指令:",data)
        cmd_res = os.popen(data.decode()).read()
        if len(cmd_res) == 0:
            print("Command has no output")
        conn.send(str(len(cmd_res.encode())).encode("utf-8"))#连续两条send可能会出现粘包,建议send后立即recv一下
        conn.send(cmd_res.encode("utf-8"))
server.close()

  服务器端代码

import socket
import os

# 生成socket实例
server = socket.socket()

# 绑定端口
server.bind(('localhost', 6969))

# 监听端口
server.listen()

# 等待链接
conn, addr = server.accept()

# 进入循环
while True:

    print('等待指令')

    # 接收指令
    data = conn.recv(1024)

    # 判断data是否存在
    if not data:
        print('断开')
        break

    # os模块获取指令
    response = os.popen(data.decode()).read()  # 获得返回 接受字符串,返回结果也是字符串

    # popen无法获得错误返回值,所以加一步判断
    if len(response) == 0:
        response = 'Error'

    # 发送返回值长度
    conn.send(str(len(response.encode())).encode())  # len里面的response也要加一个.encode()

    # 发送返回值
    conn.send(response.encode())

    print('send done')

server.close()

(1)解决ssh连接很慢的方案

我们在用ssh连接的时候大概会充裕慢,能够调动服务器端的配备文件,修改以下两项,重启服务,就会卓有成效,再重启sshd服务,之后再用ssh连接就十二分快了

vim /etc/ssh/sshd_config 编辑服务器端的配置文件

图片 5

 

图片 6

下一场systemctl restart sshd.service(centos柒)或service sshd restart(centos陆),重启一下sshd服务,就足以了

socket_server_client.py

#!/usr/local/bin/python3
# -*- coding:utf-8 -*-

import socket, os, time

server = socket.socket()
server.bind(('localhost', 9999))

server.listen()

while True:
    conn, addr = server.accept()
    print("new conn:", addr)
    while True:
        data = conn.recv(1024)
        if not data:
            print("客户端断开连接")
            break
        print("执行指令:", data)
        cmd_res = os.popen(data.decode()).read()
        conn.send(str(len(cmd_res)).encode("utf-8"))    # 先发大小给客户端

        # 防止粘包-low的方法
        # time.sleep(0.5)     # 强制缓冲区超时,防止粘包

        # 防止粘包-装逼方法     # 在两次send中间强制进行一次收发,这样就能有效防止粘包
        ack = conn.recv(1024)
        print(">>>>>:", ack.decode())

        tmp = conn.send(cmd_res.encode("utf-8"))
        print(">>>>>: 发送成功")

server.close()

客户端

(二)去掉ssh第三遍接二连三服务器提醒的yes or no?

当某台机器第三遍去老是某服务器时,会问您是还是不是要持续连接,yes or no?,敲了yes就能够在家目录下的.ssh目录下生成了二个known_hosts文件,这几个文件就记下了您所连接的每一台服务器的公钥key(如下图笔者眼下只连接了多个服务器,所以唯有叁个服务器的公钥key)

图片 7

下边就来修改配置文件来搞定那几个主题材料

vim /etc/ssh/sshd_config

将该项改为no,第二次一连不用提醒yes也许no

图片 8

 

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

__author__ = "Samson"
import socket
client = socket.socket()
client.connect(("localhost",6969))
while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:
        continue
    client.send(cmd.encode("utf-8"))
    cmd_res_size = client.recv(1024)#接受命令结果的长度
    print("命令结果大小:",cmd_res_size)
    received_size = 0
    while received_size < int(cmd_res_size.decode()):
        data = client.recv(1024)
        received_size  = len(data)#接收到的数据可能小于1024
        print(data.decode())
    else:
        print("cmd res receive done!")

client.close()

本文由澳门新葡亰发布于计算机知识,转载请注明出处:实现简单的ssh,socket实现简单ssh客户端

关键词: 程序员 python3实战

最火资讯