Linux自动批量配置SSH互信证书脚本

一、脚本

在主机上建立sh文件,名称随意,然后在文件中输入以下内容:

#!/bin/sh
DEST_USER=$1
PASSWORD=$2
HOSTS_FILE=$3
if [ $# -ne 3 ]; then
    echo "Usage:"
    echo "$0 remoteUser remotePassword hostsFile"
    exit 1
fi

SSH_DIR=~/.ssh
SCRIPT_PREFIX=./tmp
echo ===========================
# 1. prepare  directory .ssh
mkdir $SSH_DIR
chmod 700 $SSH_DIR

# 2. generat ssh key
TMP_SCRIPT=$SCRIPT_PREFIX.sh
echo  "#!/usr/bin/expect">$TMP_SCRIPT
echo  "spawn ssh-keygen -b 1024 -t rsa">>$TMP_SCRIPT
echo  "expect *key*">>$TMP_SCRIPT
echo  "send r">>$TMP_SCRIPT
if [ -f $SSH_DIR/id_rsa ]; then
    echo  "expect *verwrite*">>$TMP_SCRIPT
    echo  "send yr">>$TMP_SCRIPT
fi
echo  "expect *passphrase*">>$TMP_SCRIPT
echo  "send r">>$TMP_SCRIPT
echo  "expect *again:">>$TMP_SCRIPT
echo  "send r">>$TMP_SCRIPT
echo  "interact">>$TMP_SCRIPT

chmod +x $TMP_SCRIPT

/usr/bin/expect $TMP_SCRIPT
rm $TMP_SCRIPT

# 3. generat file authorized_keys
cat $SSH_DIR/id_rsa.pub>>$SSH_DIR/authorized_keys

# 4. chmod 600 for file authorized_keys
chmod 600 $SSH_DIR/authorized_keys
echo ===========================
# 5. copy all files to other hosts
for ip in $(cat $HOSTS_FILE)  
do
    if [ "x$ip" != "x" ]; then
        echo -------------------------
        TMP_SCRIPT=${SCRIPT_PREFIX}.$ip.sh
        # check known_hosts
        val=`ssh-keygen -F $ip`
        if [ "x$val" == "x" ]; then
            echo "$ip not in $SSH_DIR/known_hosts, need to add"
            val=`ssh-keyscan $ip 2>/dev/null`
            if [ "x$val" == "x" ]; then
                echo "ssh-keyscan $ip failed!"
            else
                echo $val>>$SSH_DIR/known_hosts
            fi
        fi
        echo "copy $SSH_DIR to $ip"

        echo  "#!/usr/bin/expect">$TMP_SCRIPT
        echo  "spawn scp -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT
        echo  "expect *assword*">>$TMP_SCRIPT
        echo  "send $PASSWORDr">>$TMP_SCRIPT
        echo  "interact">>$TMP_SCRIPT

        chmod +x $TMP_SCRIPT
        #echo "/usr/bin/expect $TMP_SCRIPT" >$TMP_SCRIPT.do
        #sh $TMP_SCRIPT.do&

        /usr/bin/expect $TMP_SCRIPT
        rm $TMP_SCRIPT
        echo "copy done."                
    fi
done

echo done.

二、建立主机列表文件

新建主机列表文件,一行一个需要建立互信的IP。

示例如下:

192.168.1.2  
192.168.1.3  
192.168.1.4  
192.168.1.5

三、启动程序及参数

运行刚才新建的.sh文件,脚本接受三个参数,远程机器用户名、密码和host文件名(相对路径或绝对路径均可)。

例如:

./auto_auth.sh app app ./hostList.cfg

脚本会生成pub公钥文件,并将公钥拷贝至指定主机。

未分类

使用sshpass expect实现非交互登录ssh远程执行命令

有时侯,利用 ssh 在本地执行远程机器的命令可以便捷地处理某些重复工作。我们希望做到:

  • 免手工输入密码
  • 支持执行多个命令,执行 shell 脚本
  • 支持执行 sudo 的命令

免手工输入密码

我们可以使用 ssh 互信,sshpass 和 expect 等工具来避免手工输密码。使用过程可能会碰到如下需要手工输入 yes 的繁琐场景:

$ ssh username@hostname
The authenticity of host ... can't be established.
ECDSA key fingerprint is ...
Are you sure you want to continue connecting (yes/no)?

为了避免出现上述场景,往 ssh 命令添加如下参数:

$ ssh -o "StrictHostKeyChecking no" username@password

SSH 互信

SSH 互信的配置非常简单,首先生成 ssh key:

$ ssh-keygen

把 public key 拷贝到信任方中:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname

之后免密执行命令:

$ ssh -o "StrictHostKeyChecking no" username@password cmd

sshpass

sshpass 是一个用于非交互的 ssh 密码验证工具,使用前先安装:

$ yum install sshpass

使用如下:

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@hostname cmd

expect

Expect 是用来进行自动化控制和测试的软件工具。虽然学习成本较高,但是 expect 的功能强大,利用 expect 可以方便的执行远程命令。使用前先安装:

$ yum install expect

例如:

#!/usr/bin/expect

spawn ssh -o "StrictHostKeyChecking no" username@hostname
expect "*assword*"
send "passwordn"
expect "*$*"
send "commandn"
expect "*$*"
send "exitn"
expect eof

Expect 不仅支持 ssh,还支持 scp, ftp 等工具。

支持多命令和脚本

执行多条命令

sshpass 和 expect 在支持多条命令上非常类似,只需用 && 连接命令即可:

# ssh trust
$ ssh -o "StrictHostKeyChecking no" username@password "cmd1 && cmd2"

例如:

# sshpass
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password "ls -a && mkdir test"

# expect
......
expect "*$*"
send "ls -a && mkdir testn"
......

执行本地脚本

对于执行本地脚本,ssh 和 sshpass 的用法类似。

# ssh trust
$ ssh -o "StrictHostKeyChecking no" username@password bash -s < shell_script.sh

# sshpass
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password bash -s < shell_script.sh

对于 expect,首先需要把脚本拷贝到远程主机,然后在远程主机执行该脚本,步骤如下:

...
# Copy script to remote host
spawn scp -o "StrictHostKeyChecking no" shell_script.sh username@hostname:~/
expect "*assword*"
send "passwordn"
expect "*100%*"
expect eof

# Execute the shell script at remote host
spawn ssh -o "StrictHostKeyChecking no" username@hostname
expect "*assword*"
send "passwordn"
expect "*$*"
send "sh shell_script.shn"
......

支持执行 sudo 命令

有些命令需要 sudo 权限才能执行,但是我们不希望重复的输入密码,我们可以把每条命令修改为如下:

cmd ---> 'echo password | sudo -S cmd'

例如:

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password "echo password | sudo -S mkdir /newdir"

对于如 echo, dd 等部分命令,有时会出现如下失败场景:

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password 'echo password | sudo -S echo hello > /newdir/newfile'
bash: /newdir/newfile: 权限不够

解决办法如下:

cmd ---> 'echo password | sudo -S sh -c "cmd"'

# For example
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password 'echo WSfdl097018= | sudo -S sh -c "echo hello >  /newdir/newfile"'

如果采用 expect,需要把脚本拷贝到远程主机,然后在远程主机采用 sudo 执行该脚本,相对 sshpass 更简便和健壮:

...
# Copy script to remote host
spawn scp -o "StrictHostKeyChecking no" shell_script.sh username@hostname:~/
expect "*assword*"
send "passwordn"
expect "*100%*"
expect eof

# Execute the shell script at remote host
spawn ssh -o "StrictHostKeyChecking no" username@hostname
expect "*assword*"
send "passwordn"
expect "*$*"
send "sudo sh shell_script.shn"
expect "*assword*"
send "passwordn"
......

强化SSH安全-使用证书登录

回顾几天前发生的某些人利用百度推广推广有后门的putty和winscp,还有由于密码简单,且端口为默认的22被暴力破解,或者被社工密码的种种安全危机,ssh安全应该引起我们的高度重视,而推荐的一种强化ssh安全的策略就是只允许使用证书登录ssh,下面介绍配置方法以及如何使用。

生成私人密钥

下载puttyfile_0.60cn2.zip文件,打开压缩包里的puttygen.exe文件,点击“生成”按钮,并在进度表的下面空白处随机移动鼠标,等生成私钥完成时,点击“保存私钥”,保存好私钥文件。这时不要关闭密钥生成器。

创建.ssh/authorized_keys

登录linux系统,创建~/.ssh/authorized_keys文件,写入密钥生成器“显示的公钥()由OpenSSH认可”一行文字下面的内容,保存好退出。

设置putty实现用证书登录

Putty→Session:将Host Name(Or IP Address)填好
Putty→Connection→Date:填好Auto-login username(自动登陆用户名)
Putty→Connection→SSH→Auth:在Private key file for authentication选择认证私钥文件
回到Putty→Session:Saved Session,填个名称保存下吧,下次直接双击名称就可以登录了.

取消密码认证登录

为了进一步增强安全,现在设置禁止使用密码登录
编辑/etc/ssh/sshd_config文件,更改为以下设置。

  1. PasswordAuthentication no

如何配置安全的SSH

这篇文章将介绍如何修改sshd的默认设置以确保sshd安全和受限制,进行保护你的服务器免受黑客入侵。每次你更改sshd的配置文件后需要重启sshd。这样做你当前的连接是不会关闭的。确保你有一个单独的以root登录的终端,以防止你错误的配置。这样做你就可以避免错误配置时仍可以使用root权限更正错误。
继续阅读如何配置安全的SSH

如何使用Putty(SSH)登录管理CentOS服务器

一、什么是SSH

SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 继续阅读如何使用Putty(SSH)登录管理CentOS服务器