一个 ssh 设置免密登陆脚本

近期应用运维的工作比较多,写了两个脚本。这一篇记录设置多台机器免密登录的。主要知识点如下:

  1. ssh-keygen 用于生成 rsa 公钥密钥。
  2. IFS 是字符串切割为数组的分隔符。
  3. 预先设置 /etc/ssh/sshd_config 里的免密登录。
  4. ssh-copy-id 用于拷贝公钥到目的服务器,授权免密登录。

脚本如下,修改前4个变量即可:

  • TARGET_IPS,填写IP和别称,可以 ssh 别称 免密登录到目的服务器。
  • IS_FULL_MESH,是否所有节点都能免密登录,还是只允许当前节点免密登录。
  • TARGET_USER_NAME,免密登录的用户名
  • RSA_NAME,密钥的名字
#!/bin/bash

#远程主机列表
TARGET_IPS="1.2.3.8:app1,1.2.3.9:app2,1.2.3.10:app3,1.2.3.11:app4,1.2.3.12:gateway1,1.2.3.13:gateway2,1.2.3.14:mmc,1.2.3.15:mid1,1.2.3.16:mid2,1.2.3.17:mid3,1.2.3.18:mid4"
#是否所有主机互通 0/1
IS_FULL_MESH=0
#远程主机用户
TARGET_USER_NAME="kelu"
#秘钥名
RSA_NAME="xxx@xxx.com"

mkdir -p $HOME/.ssh
touch $HOME/.ssh/config
ssh-keygen -t rsa -P '' -f "$HOME/.ssh/$RSA_NAME"

###### 创建config文件
IFS=","
arrayIP=($TARGET_IPS)
for ipInfo in ${arrayIP[@]}
do
	IFS=":"
	arrayIPInfo=($ipInfo)
	IP=${arrayIPInfo[0]}
	IPTAG=${arrayIPInfo[1]}
	echo -e "主机名:\t${IPTAG}"
cat >> $HOME/.ssh/config << EOF
Host   $IPTAG
  HostName   $IP
  Port       22
  User       $TARGET_USER_NAME
  IdentityFile    $HOME/.ssh/$RSA_NAME
EOF
done

chmod 644 $HOME/.ssh/config

####### 拷贝公钥
IFS=","
arrayIP=($TARGET_IPS)
for ipInfo in ${arrayIP[@]}
do
	IFS=":"
	arrayIPInfo=($ipInfo)
	IP=${arrayIPInfo[0]}
	IPTAG=${arrayIPInfo[1]}
	echo -e ">>>>>>>>>>>>>>>>>>主机IP:${IP}"
	ssh-copy-id -i "$HOME/.ssh/$RSA_NAME.pub" $TARGET_USER_NAME@$IP

        if [ "$IS_FULL_MESH" -eq 1 ];then
 	  scp $HOME/.ssh/config ${IPTAG}:/home/${TARGET_USER_NAME}/.ssh
 	  scp $HOME/.ssh/$RSA_NAME ${IPTAG}:/home/${TARGET_USER_NAME}/.ssh
	fi
done


批量检测端口连通性

最简单的办法当然还是使用ansible。

不过客户的一些生产环境没有使用ansible,就写了个简单的脚本测试了下。

关注点:

  1. 开头取了eth0这个网卡的IP地址。
  2. 在同一个目录下保存 ip_info这个文件,每行填写ip:port
#!/bin/bash

LOCALIP=`ifconfig -a | grep eth0 -A 2|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"` 

check_telnet(){
for ip_port in $(cat ./ip_info|grep -v '^#')
do
    CHECK_PORT=$(echo $ip_port|awk -F: '{print $2}')
    CHECK_IP=$(echo $ip_port|awk -F: '{print $1}')
    echo -e "\n"| telnet $CHECK_IP $CHECK_PORT |grep "Connected to\|Escape character" > /dev/null
    if [ $? -eq 0 ];then
        echo -e "$CHECK_IP\t $CHECK_PORT\t ok"
    else
        echo -e "$CHECK_IP\t $CHECK_PORT\t error!!!"
    fi
done
}

check_telnet > result.log

echo "=========$LOCALIP============="
cat result.log

Linux 中使用 Ghostscript 压缩 pdf 文件

安装

大多数 Linux 发行版已经包含了 Ghostscript 的开源版本。如果没有的话如下安装:

apt install ghostscript

使用

假如我要压缩 编程珠玑.pdf 这个文件:

/usr/bin/gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -dColorImageResolution=150 -sOutputFile=编程珠玑_compressed.pdf 编程珠玑.pdf

关于压缩质量,我们只要修改 dPDFSETTINGS 这个参数即可:

dPDFSETTINGS 描述
/prepress(默认) 高质量 (300 dpi) 但文件较大
/ebook 中质量 (150 dpi) 适中的文件大小
/screen 低质量 (72 dpi) 但输出文件较小

ebook 是在文件大小和清晰度上比较合适的,我就用了它。压缩了40%左右。

image-20220725102425521

其他更多参数参考 Ghostscript 在线文档