rsync
从远程机器同步到本地并删除目标比源目录多余的文件
rsync -avzP --delete -e 'ssh -p port' root@{remoteHost}:{remoteDir} {localDir} --exclude=dirname
从本地机器同步到远程并删除目标比源目录多余的文件
rsync -avzP --delete -e 'ssh -p port' {localDir} root@{remoteHost}:{remoteDir} --exclude=dirname
ssh隧道使用(-R)
运维的过程中间,如果碰到一个内网的机器,ip为内网的dhcp自动获取(可能ip在未来的一次重启的时候发生了变化),都可以通过在一个公网的机器上面打一个反向隧道
方案一:(配合crontab使用)
#!/bin/bash
# 公网做转发到内网,在公网上面创建一个隧道到内网机器上面,并对该隧道进行监控,配合crontab使用,该脚本执行前首先创建内网机器到公网机器的免密隧道
ROMOTE_USERNAME="root"
ROMOTE_SERVER_IP="154.9.157.30" # 公网ip
ROMOTE_PORT=22
TUNNEL_PORT=5022
LOCALHOST_IP=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
LOCALHOST_PORT=22
PID=$(/usr/bin/ssh -l ${ROMOTE_USERNAME} ${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT} netstat -nptl | grep ${TUNNEL_PORT} | grep sshd | awk '{print $NF}' | cut -d '/' -f 1)
PID=${PID%%/*}
if [ -n "$PID" ];then
IS_LISTEN=$(/usr/bin/ssh -l ${ROMOTE_USERNAME} ${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT} netstat -nptl | grep ${PID} | grep sshd | grep LISTEN | wc -l)
if [ "$IS_LISTEN" -ne "0" ];then
exit 0
else
/usr/bin/ssh -l ${ROMOTE_USERNAME} ${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT} kill -9 ${PID}
/usr/bin/ssh -CqTfnN -R 0.0.0.0:${TUNNEL_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${ROMOTE_USERNAME}@${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT}
fi
else
/usr/bin/ssh -CqTfnN -R 0.0.0.0:${TUNNEL_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${ROMOTE_USERNAME}@${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT}
fi
方案二:(内网机器启动之后执行,while死循环)
#!/bin/bash
# 公网做转发到内网,在公网上面创建一个隧道到内网机器上面,并对该隧道进行监控
while [ true ]
do
ROMOTE_USERNAME="root"
ROMOTE_SERVER_IP="154.9.187.30" #公网ip
ROMOTE_PORT=22
TUNNEL_PORT=5022
LOCALHOST_IP=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
LOCALHOST_PORT=22
PID=$(/usr/bin/ssh -l ${ROMOTE_USERNAME} ${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT} netstat -nptl | grep ${TUNNEL_PORT} | grep sshd | awk '{print $NF}' | cut -d '/' -f 1)
PID=${PID%%/*}
if [ -n "$PID" ];then
IS_LISTEN=$(/usr/bin/ssh -l ${ROMOTE_USERNAME} ${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT} netstat -nptl | grep ${PID} | grep sshd | grep LISTEN | wc -l)
if [ "$IS_LISTEN" -ne "0" ];then
sleep 30
else
/usr/bin/ssh -l ${ROMOTE_USERNAME} ${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT} kill -9 ${PID}
/usr/bin/ssh -CqTfnN -R 0.0.0.0:${TUNNEL_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${ROMOTE_USERNAME}@${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT}
fi
else
/usr/bin/ssh -CqTfnN -R 0.0.0.0:${TUNNEL_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${ROMOTE_USERNAME}@${ROMOTE_SERVER_IP} -p ${ROMOTE_PORT}
fi
done