一、Linux无密码登陆

  • a.通过设置KEY登陆(推荐)
    生成密钥:ssh-keygen
    安装密钥到远程主机:ssh-copy-id 用户名@主机地址
    注意:ssh-copy-id 将key写到远程机器的 ~/.ssh/authorized_key 文件中。

  • b.使用sshpass命令(需安装):
    sshpass -p "ssh密码" ssh 用户名@主机地址

  • c.使用plink工具连接(windows):
    plink.exe -pw "ssh密码" ssh 用户名@主机地址

二、Linux命令应答命令expect(需安装)

  • 1.expect简介
    expect 是用来进行自动化控制和测试的工具。主要是和交互式软件 telnet ftp passwd fsck rlogin ssh tip 等进行自动化的交互。

  • 2.expect关键命令

    1. send //向进程发送字符串模拟用户的输入,注意一定要加 \r 回车
    2. expect //从进程接收字符串
    3. spawn //启动进程(由spawn启动的进程的输出可以被expect所捕获)
    4. interact //用户交互
  • 3.expect使用
    单一分支语法:
    1. expect "hello" {send "you said hello"}


当输出中包含hello后,输出you said hello
多分支模式语法:

expect {
      "lilei" {send "hello lilei"; exp_continue}
      "hanmeimei" {send "hello hanmeimei"; exp_continue}
      "how do you do ?" {send "how do you do"}
}


命令说明:
当输出中包含lilei时 输出hello lilei,同时循环此多分支语句。
当输出中包含hanmeimei时 输出hello hanmeimei,同时循环此多分支语句。
当输出中包含how do you do ?时 输出dow do you do。

  • 4.使用实例

    • 远程登录服务器并创建文件夹
      #!/usr/bin/expect 
      set timeout -1
      spawn ssh root@192.168.0.107
      expect {
      "password" {send "123456\r";}
      "yes/no" {send "yes\r";exp_continue}
      }
      expect "root" {send "mkdir test\r"}
      expect eof
      exit
      
  • expect脚本获取参数:
    #!/usr/bin/expect 
    set ip [lindex $argv 0]
    set password [lindex $argv 1]
    set timeout -1
    spawn ssh root@$ip
    expect {
    "password" {send "$password\r";}
    "yes/no" {send "yes\r";exp_continue}
    }
    expect "root" {send "mkdir test1\r"}
    expect "root" {send "mkdir test2\r"}
    send "exit\r" //退出远程登录
    expect eof
    exit
    


./expect.ex 192.168.0.107 123456

  • 远程登录服务器等待手动操作:
    #!/usr/bin/expect 
    set ip [lindex $argv 0]
    set password [lindex $argv 1]
    set timeout -1
    spawn ssh root@$ip
    expect {
    "password" {send "$password\r";}
    "yes/no" {send "yes\r";exp_continue}
    }
    interact
    


./expect.ex 192.168.0.107 123456

  • 使用scp传输文件:
    #!/usr/bin/expect 
    set timeout -1
    spawn scp test.txt root@192.168.0.107:/home/
    expect {
    "password" {send "123456\r";}
    "yes/no" {send "yes\r";exp_continue}
    }
    expect eof
    exit
    
  • 在本地开启socks5的代理:
    #!/usr/bin/expect 
    set timeout -1 //expect匹配输出的超时时间
    spawn ssh -N -D 0.0.0.0:1080 localhost //新建一个进程,执行ssh命令
    expect {
    "yes/no" {send "yes\r";exp_continue} //
    "password" {send "123\r"}
    }
    expect eof
    exit
    


命令说明:
根据进程输出执行预先设置好的命令:
假如输出包含yes/no,则表示是第一次登入需要输入yes来添加信任。exp_continue表示继续此循环。
假如输出包含password,表示需要输入密码。
expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记,因为ssh -N -D 0.0.0.107:1080 localhost 程序需要一直运行,所以将timeout设置为-1即可无限制的等待。

  • 指定登陆机器
    从computerInfo里读取相应机器信息,用户选择登陆其中一台机器。
    computerInfo.txt内容:
    #ip port user password description          
    192.168.1.1 root 123456 'first machine'          
    192.168.1.2 root 123456 'second machine'
    


core.ex脚本内容:

#!/usr/bin/expect 
set ip [lindex $argv 0]
set port [lindex $argv 1]
set username [lindex $argv 2]
set password [lindex $argv 3]
set timeout -1
spawn ssh -p $port $username@$ip
expect {
    "password" {send "$password\r";}
    "yes/no" {send "yes\r";exp_continue}
}
interact


login.sh脚本内容:

#!/bin/bash
file="computerInfo.txt"
#显示机器信息 过滤第一行和空行
awk '{if (NR > 1 && $1 != ""){printf "%-2s %-45s %-15s \n",NR")",$5,$1}}' $file 
echo "please choose which machine to login:"
read number
#将信息存入变量
read ip port user password <<< $(echo `awk 'NR=="'$number'"{print $1,$2,$3,$4}' $file`)
./core.ex $ip $port $user $password

参考文章:
Linux Expect 简介和使用实例