最近写了一个golang ssh客户端,参照网上的ssh client做了些修改,如果需要进行操作审计,那用golang生成的ssh代替原生的ssh就非常简单了


代码如下

package main

import (
   "fmt"
   "golang.org/x/crypto/ssh"
   "golang.org/x/crypto/ssh/terminal"
   "os"
   "log"
   "io/ioutil"
   "flag"
   "os/user"
   "time"
   "net"
)

func Client(userName, ip, sshKey string) {

   privateKey, err := ioutil.ReadFile(sshKey)
   if err != nil {
      log.Fatal(err)
   }

   signer, err := ssh.ParsePrivateKey(privateKey)
   if err != nil {
      log.Fatal(err)
   }

   config := &ssh.ClientConfig{
      User: userName,
      Auth: []ssh.AuthMethod{
         ssh.PublicKeys(signer),
      },
      HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
         return nil
      },
      Timeout: 30 * time.Second,
   }

   client, err := ssh.Dial("tcp", ip, config)
   if err != nil {
      fmt.Println("建立连接: ", err)
      return
   }
   defer client.Close()
   session, err := client.NewSession()
   if err != nil {
      fmt.Println("创建Session出错: ", err)
      return
   }
   defer session.Close()

   fd := int(os.Stdin.Fd())
   oldState, err := terminal.MakeRaw(fd)
   if err != nil {
      fmt.Println("创建文件描述符: ", err)
      return
   }

   session.Stdout = os.Stdout
   session.Stderr = os.Stderr
   session.Stdin = os.Stdin

   termWidth, termHeight, err := terminal.GetSize(fd)
   if err != nil {
      fmt.Println("获取窗口宽高: ", err)
      return
   }
   defer terminal.Restore(fd, oldState)

   modes := ssh.TerminalModes{
      ssh.ECHO:          1,
      ssh.TTY_OP_ISPEED: 14400,
      ssh.TTY_OP_OSPEED: 14400,
   }

   if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
      fmt.Println("创建终端出错: ", err)
      return
   }

   err = session.Shell()
   if err != nil {
      fmt.Println("执行Shell出错: ", err)
      return
   }

   err = session.Wait()
   if err != nil {
      fmt.Println("执行Wait出错: ", err)
      return
   }
}

func main() {

   usr, err := user.Current()
   if err != nil {
      fmt.Println(err)
   }

   var sshF = usr.HomeDir + "/.ssh/id_rsa"

   p := flag.String("p", "22", "输入端口")
   i := flag.String("i", sshF, "输入所需的私钥")
   ip := flag.String("ip", "", "输入ip地址")
   flag.Parse()
   fmt.Println("  __              _               _")
   fmt.Println(" / _|_   _ _ __  | |___   __   __| | _____   _____  _ __  ___")
   fmt.Println("| |_| | | | '_ \\ | __\\ \\ / /  / _ ` |/ _ \\ \\ / / _ \\| '_ \\/ __|")
   fmt.Println("|  _| |_| | | | || |_ \\ V /  | (_| |  __/\\ V / (_) | |_) \\__ \\")
   fmt.Println("|_|  \\__,_|_| |_(_)__| \\_/    \\__,_|\\___| \\_/ \\___/| .__/|___/")
   fmt.Println("                                                   |_|")
   fmt.Println("     ,           ,")
   fmt.Println("    /             \\")
   fmt.Println("   ((__---,,,---__))")
   fmt.Println("      (_) O O (_)_________")
   fmt.Println("         \\ _ /            |\\")
   fmt.Println("          o_o \\ voilet    | \\")
   fmt.Println("               \\   _____  |  *")
   fmt.Println("                |||   WW|||")
   fmt.Println("                |||     |||")
   fmt.Println("")
   fmt.Println("--------------------------------------------------------------")
   fmt.Println("如有任何系统问题,请随时联系运维人员")
   fmt.Println("运维邮箱: voilet@qq.com")
   fmt.Println("友情提示:谨慎操作,规避风险")
   fmt.Println("ssh -i ./ssh/id_rsa -p 2222 -ip 192.168.1.1")
   fmt.Println("可使用的参数 -P指定端口 -i指定key -ip需要登录的主机")
   fmt.Println("-------------------------------------------------------------")

   Client(usr.Name, *ip + ":" + *p, *i)
}

二月 10th, 2017

Posted In: linux系统

标签:,

简介

qyssh是一个基于ssh证书认证的简单服务器批量管理工具,不支持使用密码登陆的服务器,可以使用qyscp配合qyssh来完成一些脚本的分发与执行工作。

源码

服务器批量管理(qyssh)
#!/bin/bash

#specify default ssh port
PORT=22

#specify default ssh user
USER=root

#specify ssh connecttimeout
Timeout=3

usage()
{
    echo "\
usage: qyssh [-i Path/to/identity ] [-p SSH-Port (default:22)] [-t Connect TimeOut (default:3s)]
             [-u SSH-User (default:root)] [-l Server-List-File] [-c Command ]"
}

kill_ssh_agent()
{
    killall ssh-agent > /dev/null 2>&1
}

while getopts :i:p:u:l:c:t: OPTION
do
    case $OPTION in
    i)
        KEY=$OPTARG
    ;;
    p)
        PORT=$OPTARG
    ;;
    u)
        USER=$OPTARG
    ;;
    l)
        LIST=$OPTARG
    ;;
    c)
        COMMAND=$OPTARG
    ;;
    t)
        Timeout=$OPTARG
    ;;
    ?)
        usage
        exit 1
    ;;
    esac
done

if [ "$KEY"x == "x" ];then
    echo "You must specify a identity with -i option"
    usage
    exit 1
fi

if [ "$LIST"x == "x" ];then
    echo "You must specify a server list file with -l option"
    usage
    exit 1
fi

if [ "$COMMAND"x == "x" ];then
    echo "You must specify a command with -c option"
    usage
    exit 1
fi

kill_ssh_agent
eval `ssh-agent` > /dev/null 2>&1
ssh-add $KEY

server_list=`sed '/^$/d;/^#/d' $LIST`

SSH_COMMAND="ssh -o ConnectTimeout=$Timeout -p $PORT "$USER"@"

for i in $server_list
do
    echo -e "Execute command : \"$COMMAND\" at Host : $i "
    echo "-------------------------------------------------"
    $SSH_COMMAND$i $COMMAND
    case $? in
    0)
        echo -e "executed [ \033[32mOK\033[0m ]!"
    ;;
    ?)
        echo -e "executed [ \033[31mFAILED\033[0m ]!"
    ;;
    esac
    sleep 1
done

kill_ssh_agent
批量文件分发(qyscp)
#!/bin/bash

#specify default ssh port
PORT=22

#specify default ssh user
USER=root

#specify ssh connecttimeout
Timeout=3

usage()
{
    echo "\
usage: qyscp [-i Path/to/identity ] [-p SSH-Port (default:22)] [-t Connect TimeOut (default:3s)]
             [-u SSH-User (default:root)] [-l Server-List-File] FILE TO-PATH"
}

let file=$#-1
TO_PATH=${!#}
FILE=${!file}
unset file

kill_ssh_agent()
{
    killall ssh-agent > /dev/null 2>&1
}

while getopts :i:p:u:l:t: OPTION
do
    case $OPTION in
    i)
        KEY=$OPTARG
    ;;
    p)
        PORT=$OPTARG
    ;;
    u)
        USER=$OPTARG
    ;;
    l)
        LIST=$OPTARG
    ;;
    t)
        Timeout=$OPTARG
    ;;
    ?)
        usage
        exit 1
    ;;
    esac
done

if [ "$KEY"x == "x" ];then
    echo "You must specify a identity with -i option"
    usage
    exit 1
fi

if [ "$LIST"x == "x" ];then
    echo "You must specify a server list file with -l option"
    usage
    exit 1
fi

if [ "$FILE" == "$KEY" -o \
      "$FILE" == "$PORT" -o \
      "$FILE" == "$USER" -o \
      "$FILE" == "$LIST"  -o \
      "$FILE" == "$Timeout" ];then
    usage
    exit 1
fi

kill_ssh_agent
eval `ssh-agent` > /dev/null 2>&1
ssh-add $KEY

server_list=`sed '/^$/d;/^#/d' $LIST`

SCP_COMMAND="scp -o ConnectTimeout=$Timeout -P $PORT $FILE "$USER"@"

for i in $server_list
do
    echo -e "Execute scp : \"$FILE\" to Host : $i:$TO_PATH "
    echo "-------------------------------------------------"
    $SCP_COMMAND$i:$TO_PATH
    case $? in
    0)
        echo -e "[ \033[32mOK\033[0m ]!"
    ;;
    ?)
        echo -e "[ \033[31mFAILED\033[0m ]!"
    ;;
    esac
    sleep 1
done

kill_ssh_agent

安装

将脚本拷贝到/usr/local/sbin并赋予可执行权限即可

使用

qyssh

设置必要的参数

使用该脚本必须通过-i参数指定一个密钥,使用-c参数指定需要执行的命令,使用-l参数指定一个服务器列表文件,一个典型的服务器列表文件如下:

cat /home/yourhome/test_server_list

内容如下:

#team1_server
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
#team2_server
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6

这个文件可以包含注释。

使用方法

首先请确保你的密钥文件权限为400,以便在命令中指定。

[root@testsbin]# ls -l /home/yourhome/key
-r-------- 1 root root 736 12-31 17:01 /home/yourhome/key

用法: qyssh [-i [证书文件,必须参数] ] [-p ssh端口号 (default:22)][-u ssh用户 (default:root)]

[-l 服务器列表文件 (default:read the database)][-c 执行的命令 ][-t 连接超时时间 (default:3s)]

qyssh -u yourhome -p 60000 -i /home/yourhome/key -l /home/yourhome/test_server_list -c ls
批量获取TCP连接数并排序

使用-c指定批量执行的ssh命令。

qyssh -i /home/yourhome/key -u yourhome -l /home/yourhome/test_server_list -p 60000 -t 10 -c "netstat -nat |awk '{print \$6}'|sort|uniq -c | sort -rn"

注意如果你的命令中包含带$的变量,请使用\避免其替换变量。

上述命令输出的结果如下:

Execute command : "netstat -nat |awk '{print $6}'|sort|uniq -c | sort -rn" at Host : 192.168.1.2
-------------------------------------------------
    282 ESTABLISHED
     26 FIN_WAIT2
     11 TIME_WAIT
      8 LISTEN
      1 Foreign
      1 established)
executed [ OK ]!
Execute command : "netstat -nat |awk '{print $6}'|sort|uniq -c | sort -rn" at Host : 192.168.1.3
-------------------------------------------------
    257 ESTABLISHED
      8 LISTEN
      1 Foreign
      1 established)
executed [ OK ]!
Execute command : "netstat -nat |awk '{print $6}'|sort|uniq -c | sort -rn" at Host : 192.168.1.4
-------------------------------------------------
    260 ESTABLISHED
     14 LISTEN
      1 Foreign
      1 established)
executed [ OK ]!
Execute command : "netstat -nat |awk '{print $6}'|sort|uniq -c | sort -rn" at Host : 192.168.1.5
-------------------------------------------------
   4985 TIME_WAIT
   1939 SYN_RECV
    122 FIN_WAIT1
     54 LAST_ACK
     32 ESTABLISHED
      7 LISTEN
      6 FIN_WAIT2
      5 CLOSING
      1 Foreign
      1 established)
executed [ OK ]!
......etc......

qyscp

首先请确定你的系统装有scp,该工具基于scp。

设置必要的参数

qyssh

使用方法

首先请确保你的密钥文件权限为400,以便在命令中指定。

[root@test sbin]# ls -l /home/yourhome/key
-r-------- 1 root root 736 12-31 17:01 /home/yourhome/key

用法: qyscp [-i [证书文件,必须参数] ] [-p ssh端口号 (default:22)][-t 连接超时时间 (default:3s)]

[-l 服务器列表文件 (default:read the database)][-u ssh用户 (default:root)] [本地文件路径] [拷贝路径]

qyscp -i /home/test/key -l /root/test_server_list -p 60000 ./test.sh /root/

实例

批量添加用户

1、首先编写脚本useradd.sh

#!/bin/bash
user=testuser
useradd $user
mkdir -p /home/$user/.ssh
cat > /home/$user/.ssh/.keys <<EOF
......ssh密钥,此处略.....
EOF
echo "$user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chown $user.$user /home/$user -R

2、使用qyscp分发

qyscp -l /root/test_server_list -p 60000 -i /home/test/key ./useradd.sh ~

3、执行脚本并且在执行完成后删除脚本

qyssh -l /root/test_server_list -p 60000 -i /home/test/key -c "sh ~/useradd.sh && rm -rf ~/useradd.sh"

四月 20th, 2012

Posted In: linux系统

标签:, ,

Linux 2.6.39 到 3.2.0 内核爆提权漏洞,普通用户可以通过运行特定代码获得 root 权限。

 /*
 * Mempodipper
 * by zx2c4
 *
 * Linux Local Root Exploit
 *
 * Rather than put my write up here, per usual, this time I've put it
 * in a rather lengthy blog post: http://blog.zx2c4.com/749
 *
 * Enjoy.
 *
 * - zx2c4
 * Jan 21, 2012
 *
 * CVE-2012-0056
 */

(更多…)

一月 29th, 2012

Posted In: linux系统

标签:, , ,

无觅相关文章插件,快速提升流量