原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

场景

很多时候,我们需要批量操作多台机器,业界一般使用Ansible来实现,但使用Ansible来操作多台机器的前提是需要有ssh权限的,可悲的是,对于开发人员来说,一般是没有正式环境机器的ssh权限的,只能通过一个指定的入口登录机器,也可以理解,毕竟正式环境如此重要。

不过,如果你的生产环境可以访问你的开发机,那么可以通过反向Shell来访问机器,然后将反向Shell与tmux结合,又可实现同时操作多台机器的效果,这就是本文要介绍的。

正反向Shell

如果你了解过nc命令,一定听说过nc可以建立正向或反向Shell,这里就不解释正向或反向Shell的概念了,解释不清,直接上nc实现正向Shell与反向Shell的例子。

由于nc命令本身存在模糊性,有些文章介绍的nc命令是ncat,有些文章介绍的nc命令又是netcat,这两个还是有些差别的,故这里的例子,直接使用ncat避免混淆。

开发机ip为192.168.0.10

服务器ip为192.168.0.1

#正向Shell,1.服务器上使用ncat监听
ncat -l 9999 -e /bin/bash
#正向Shell,2.开发机上连接
ncat 192.168.0.1 9999 #反向Shell,1.开发机上使用ncat监听
ncat -l 9999
#反向Shell,2.服务器上连接
ncat 192.168.0.10 9999 -e /bin/bash

效果如下:

  • 正向Shell:ncat在服务器上以9999端口监听,当开发机用ncat连接,连接成功后,服务器上的ncat会打开一个bash进程为这个连接服务。
  • 反向Shell:ncat在开发机上以9999端口监听,当服务器用ncat连接,连接成功后,服务器上的ncat会打开一个bash进程为这个连接服务。

其实正反向Shell的区别只是建立TCP连接的方向不同而已,如下为ncat提供的Shell大概交互过程:

ncat(client) <-> ncat(server) <-> bash

当在开发机的ncat里面输入命令并Enter后,命令会通过ncat(client)走网络,发送给ncat(server),ncat(server)收到命令后,会将命令发送给bash进程执行,bash进程执行后,命令执行的结果,又会返回给ncat(server),而ncat(server)又通过网络连接返回给开发机上的ncat(client)显示出来。

但是,当你真正来使用这个反向Shell时,会发现有诸多不便,比如使用tail -f来查看日志文件,完事后你想Ctrl + C退出tail,却发现连ncat进程也退出了,这是最无法忍受的一点了,另外,像Tab补全/Up Arrow history/vim/Ctrl + d/Ctrl + z之类的,也都无法使用,非常难受。我们一般称获取到的这种Shell叫Weak Shell,而如果要获取Strong Shell,就需要socat上场了。

通过socat获取Strong Shell

socat与nc命令类似,但它比nc要强大得多,比如通过socat可以获取一个完整的Shell,如下:

#正向Shell,1.服务器上使用socat监听
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork
#正向Shell,2.开发机上连接
socat file:`tty`,raw,echo=0 tcp:192.168.0.1:9999 #反向Shell,1.开发机上使用socat监听
socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork
#反向Shell,2.服务器上连接
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999

效果如下:

原理和ncat类似,不过socat可以提供tty和pty,因为像Ctrl + C之类的,本身就是终端tty提供给bash的信号,而不是字符,所以在ncat里,由于没有tty,Ctrl + C信号是无法传递给服务端的bash程序的。

socat提供的Shell交互过程大概是这样的:

tty <-> socat(client) <-> socat(server) <-> pty <-> bash

那什么是tty?这里我也理解得不是很透彻,可以简单认为键盘和屏幕就是tty,键盘敲的内容会作为tty的输入,tty输出的内容,会显示到屏幕上。

tmux实现多机同时操作

tmux是一个终端复用器,最常用的是实现分屏,既然通过socat已经可以获取到反向Shell了,那么把各个机器的反向Shell显示到tmux的各个分屏上,就可以看到多个反向Shell的命令执行结果,同时,将某个特殊分屏的tty操作,同时转发给多个反向Shell,就实现了多机同时操作,效果如下:

下面是实现多机操作的命令:

# 1.开发机上监听
nohup socat tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork exec:'bash socatscript.sh' &
# 2.在多个服务器上连接
nohup socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999 &
# 3.进入tmux分屏界面
tmux a -t socatSession

这是脚本socatscript.sh的实现

#!/bin/bash

SOCKDIR=$(mktemp -d)
SOCKF=${SOCKDIR}/usock
SESSION_NAME=${1:-socatSession}
WINDOW_NAME=${2:-socatWindown} # create session and window
tmux has-session -t $SESSION_NAME
if [[ $? -eq 1 ]];then
tmux new -s $SESSION_NAME -n $WINDOW_NAME -d "socat file:\`tty\`,raw,echo=0 exec:'ncat -lk 9998'"
fi
# split windown 0
tmux split-window -h -t 0 "socat file:\`tty\`,raw,echo=0 UNIX-LISTEN:${SOCKF},umask=0077"
tmux select-pane -t 0
tmux select-layout -t $WINDOW_NAME main-horizontal
tmux resize-pane -t 0 -y 2
# Wait for socket
while test ! -e ${SOCKF} ; do sleep 1 ; done
while ! $(ncat -z localhost 9998) ;do sleep 1; done;
# Use socat to ship data between the unix socket and STDIO.
socat -U STDOUT TCP:localhost:9998 &
exec socat STDIO UNIX-CONNECT:${SOCKF}

主要功能是,每当有一个反向Shell连接时,在tmux上新建一个分屏,并将反向Shell显示在这个新建的分屏上,同时,提供一个特殊的分屏(最上面那个),在这个分屏上的输入的命令,会转发到各个反向Shell里。

如果你发现反向Shell里的文字不能满屏显示,需要通过 stty rows 63 columns 204 重新设置一下当前tty的显示宽高。

并且,如果你有ssh机器的权限,同时也想使用这种tmux分屏的方式执行命令,只需要将bash更换成ssh即可,如下:

# 1.开发机上监听
nohup socat tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork exec:'bash socatscript.sh' &
# 2.开发机上,使用ssh连接到多个机器
nohup socat exec:'sshpass -p "xxx" ssh root@192.168.0.10',pty,stderr,setsid,sigint,sane tcp:localhost:9999 &
# 3.进入tmux分屏界面
tmux a -t socatSession

是不是很爽,连ansible也可以不用装了!

总结

socat命令非常的强大,值得好好的研究一翻,同时当你研究成功后,会发现自己对各种概念的理解,又上升了一步。

使用socat反向Shell多台机器的更多相关文章

  1. shell远程操作另外一台机器上数据

    shell远程操作另外一台机器上的数据,有两种方式: 1 .配置免密登陆,2.使用sshpass 当前存在两台虚拟机,ip地址分别为:192.168.3.32 192.168.3.33 一.免密登陆操 ...

  2. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息

    ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...

  3. linux利用ssh远程执行多台机器执行同样的命令

    这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下 ssh执行远程操作命令格式代码如下: ssh -t ...

  4. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

  5. Gitlab 赋予某台机器git clone的权限 Deploy key

    开发项目CI(持续化部署)的时候,需要赋予jeckins所在的机器从gitlab远程仓库克隆代码到本地的权限. 之前我们基本都是通过管理gitlab某个项目的成员的方式,管理gitlab的权限. 但是 ...

  6. 七台机器部署Hadoop2.6.5高可用集群

    1.HA架构注意事项 两个Namenode节点在某个时间只能有一个节点正常响应客户端请求,响应请求的节点状态必须是active standby状态要能够快速无缝切换成active状态,两个NN节点必须 ...

  7. 反向Shell增强

    下载socat 在客户端: socat file:`tty`,raw,echo=0 tcp-listen:4444 在服务端: socat exec:'bash -li',pty,stderr,set ...

  8. centos 安装redis(一台机器可以安装多个redis)

    我在运行时redis版本是2.8 操作前设置以管理员身份: 打开终端输入 su - 安装redis需要确保系统已经安装了(gcc gcc-c++)# yum -y install gcc gcc-c+ ...

  9. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

随机推荐

  1. 编译安装haproxy

    一.安装lua环境 1.1 安装依赖包 [root@centos7 ~]# yum install gcc readline-devel 1.2 下线lua源码包并解压 [root@centos7 ~ ...

  2. async同步异步

    1.同步:var async = require("async"); async.series([step1, step2, step3],function(err, values ...

  3. R数据分析:数据清洗的思路和核心函数介绍

    好多同学把统计和数据清洗搞混,直接把原始数据发给我,做个统计吧,这个时候其实很大的工作量是在数据清洗和处理上,如果数据很杂乱,清洗起来是很费工夫的,反而清洗好的数据做统计分析常常就是一行代码的事情. ...

  4. CentOS7搭建ntp时钟服务器

    文章目录 服务器配置 远程客户端配置 服务器配置 # 关闭防火墙,selinux=disabled 1.# 服务器部署 [root@localhost ~]# yum -y install ntp n ...

  5. DDD-领域驱动设计简谈

    看到网上讨论 DDD 的文章越来越多,咱也不能甘于人后啊,以下是我对 DDD 的个人理解,短小精悍,不喜忽喷. 也谈DDD(领域驱动设计) 解决什么问题 传统模式,产品评审结束,开发人员就凭经验拆分模 ...

  6. 实战 | 关于随手一点就发现XSS漏洞这件事

    起因 今天正在做一个项目时,需要找一个云接码平台接码去登录系统.当我随手从百度找了一个接码平台时,一个偶然的发现,有了今天这篇文章. 正文 当我进入这个接码平台随便找了个手机号,然后等了好几分钟都没啥 ...

  7. 【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台

    前言   大家好,我是福隆苑居士,今天给大家聊聊XXL-JOB的使用.   XXL-JOB是本人呆过的三家公司都使用到的分布式任务调度平台,前两家都是服务于传统行业(某大型移动基地和某大型电网),现在 ...

  8. 017 Linux 之啥是 ssh ?

    1 什么是 ssh?有什么用? (1)ssh 是一种协议 SSH(Secure Shell) 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信 ...

  9. MYSQL 获取最近多少天时间列表

    1.首先获取一个最近1000天的时间列表,如果不够可以按规则再加 SELECT adddate(CURDATE(),-(t2.i * 100 + t1.i * 10 + t0.i)) date FRO ...

  10. AQS源码二探-JUC系列

    本文已在公众号上发布,感谢关注,期待和你交流. AQS源码二探-JUC系列 共享模式 doAcquireShared 这个方法是共享模式下获取资源失败,执行入队和等待操作,等待的线程在被唤醒后也在这个 ...