多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### 1. 多机ssh免密登录 * 花了一点时间写了一个免密脚本,当做学shell的实践了,可能有点粗糙。 > 1. 两个脚本和一个文件放在同一个目录下 > 2. 把主机地址填写到两个脚本中,空格分割 > 3. 顺序执行以下命令,就可以完成多台主机的ssh免密 ~~~ ./batchscp.sh ssh ./batchscp.sh scp ./batchscp.sh exe ~~~ * batchscp.sh ~~~ #!/bin/bash HOST_LIST=("192.168.56.130" "192.168.56.131" "192.168.56.132") PASSWD=tuna USER=tuna SSH_PORT=22 PWD=`pwd` echo "当前目录:$PWD" scp(){ for ip in ${HOST_LIST[@]} do sshpass -p $PASSWD scp -P $SSH_PORT ${PWD}/autoSSH.sh $USER@$ip:/home/$USER if [ $? -eq 0 ];then echo "scp successed" else echo "scp failed ip:$ip" fi done } ssh(){ for ip in ${HOST_LIST[@]} do sshpass -p $PASSWD ssh -o "StrictHostKeyChecking=no" -t $USER@$ip "ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa " done } exe(){ for ip in ${HOST_LIST[@]} do sshpass -p $PASSWD ssh -o "StrictHostKeyChecking=no" -t $USER@$ip "chmod +x ~/autoSSH.sh;source ~/autoSSH.sh && rm -rf ~/autoSSH.sh" done } case $1 in scp) scp ;; ssh) ssh ;; exe) exe ;; *) echo "完成ssh免密,顺序执行:1.ssh 2.scp 3. exe" ;; esac ~~~ * autoSSH.sh ~~~ #!/bin/bash USER=tuna PASSWD=tuna HOST_LIST=("192.168.56.130" "192.168.56.131" "192.168.56.132") for ip in ${HOST_LIST[@]} do sshpass -p $PASSWD ssh -o "StrictHostKeyChecking=no" -t $USER@$ip "echo '************scp id_rsa.pub to $ip *************'" \ && sshpass -p $PASSWD ssh-copy-id -i ~/.ssh/id_rsa.pub $USER@$ip done ~~~ ### 2. tomcat自启动 ~~~ #!/bin/bash export PATH=$JAVA_HOME/bin:$PATH CATALINA_HOME=/home/timing/application/tomcat-timing/ TOMCAT_USER=timing TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" SHUTDOWN_WAIT=20 tomcat_pid() { echo `ps -ef | grep $CATALINA_HOME | grep -v grep | awk '{print $2}'` } start() { pid=$(tomcat_pid) if [ -n "$pid" ];then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else echo -e "\e[00;32mStarting tomcat\e[00m" su - $TOMCAT_USER -c "$CATALINA_HOME/bin/startup.sh" fi } status(){ pid=$(tomcat_pid) if [ -n "$pid" ];then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ];then echo -e "\e[00;31mStoping Tomcat\e[00m" $CATALINA_HOME/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n"; sleep 1 let count=$count+1; done if [ $count -gt $kwait ];then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 } user_exists(){ if id -u $1 >/dev/null 2>&1; then echo "1" else echo "0" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0 1,1 顶端 ~~~ ### 3. 保存用户操作记录 vim /etc/profile 全局环境配置文件,每个用户登录时,都会执行这个文件 ~~~ history USER=`whoami` USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` if [ "$USER_IP" = "" ]; then USER_IP=`hostname` fi if [ ! -d /var/log/history ]; then mkdir /var/log/history chmod 777 /var/log/history fi if [ ! -d /var/log/history/${LOGNAME} ]; then mkdir /var/log/history/${LOGNAME} chmod 300 /var/log/history/${LOGNAME} fi export HISTSIZE=4096 DT=`date +"%Y%m%d_%H:%M:%S"` export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT" chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null ~~~ > * HISTFILE变量: > 1. 定义了命令历史列表保存在哪个文件中。查看HISTFILE变量定义为$HOME/.bash_history文件中,但是家目录下没有该文件。 >2. 于是清楚了reboot之后为什么history查询不到上一次命令历史列表的原因:因为没有$HOME/.bash_history这个文件。重新制定该变量,会为每个登录的用户生成记录文件(例如上边的脚本) > * history命令: > 1. 用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。 > 2. 在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。 > * 为什么当次启动的命令历史列表可以通过history命令查询呢? > 1. history命令是bash内置命令,所有的命令历史在当前bash还存在的时候是保存在内存中的,只有在bash退出时才会从内存中flush到$HISTFILE变量指定的文件中(创建文件) > 2. 这也就是为什么当次的命令历史列表在当前bash中能够通过history命令查询,但是reboot之后却无法查询的原因。 > ### 4. 发送邮件 ~~~ #!/bin/bash to=$1 subject=$2 body=$3 /usr/local/bin/sendEmail -f 18343019464@sina.cn -t "$to" -s smtp.sina.cn -u "$subject" -o message-content-type=html -o message-charset=utf8 -xu '18343019464@sina.cn' -xp '密码' -m "$body" ~~~