对于有多个环境连接信息的情况下使用 Mac 环境原生自带 SSH SCP 不是很方便,所以写了该 Shell 脚本来简化 SSH SCP 命令。
安装依赖
brew install hudochenkov/sshpass/sshpass
设置别名
设置环境变量.zshrc或.bash_profile
# 使用zsh终端
vim ~/.zshrc
- 将下面shell脚本复制到.zshrc文件中
declare -a dev_dict
declare -a pro_dict
# 测试环境(名称 别名 用户@IP 密码)
dev_dict+=("测试环境1 csapp1 root@192.168.0.100 pwd123")
dev_dict+=("测试环境2 csapp2 root@192.168.0.101 pwd123")
dev_dict+=("end")
# 生产环境(名称 别名 用户@IP 密码)
pro_dict+=("生产环境1 scapp1 root@192.168.0.200 pwd123")
pro_dict+=("生产环境2 scapp2 root@192.168.0.201 pwd456")
pro_dict+=("end")
function _scp_upload() {
host=$1
password=$2
# 来源目录
param_source=$3
# 目标目录
param_target=$4
# -r 目录
param_is_dir=$5
if [ -z "$param_is_dir" ]; then
echo "阿里云首次登录需要使用ssh先连接一次(ssh root@IP)"
echo "ssh $host $password"
sshpass -p $password scp "$param_source" $host:"$param_target"
else
echo "阿里云首次登录需要使用ssh先连接一次(ssh root@IP)"
echo "ssh $host $password"
sshpass -p $password scp "$param_is_dir" "$param_source" $host:"$param_target"
fi
}
function _scp_download() {
host=$1
password=$2
# 来源目录
param_source=$3
# 目标目录
param_target=$4
# -r 目录
param_is_dir=$5
if [ -z "$param_is_dir" ]; then
echo "阿里云首次登录需要使用ssh先连接一次(ssh root@IP)"
echo "ssh $host $password"
sshpass -p $password scp $host:"$param_source" "$param_target"
else
echo "阿里云首次登录需要使用ssh先连接一次(ssh root@IP)"
echo "ssh $host $password"
sshpass -p $password scp "$param_is_dir" $host:"$param_source" "$param_target"
fi
}
function myssh() {
param_env=$1
if [ -z $param_env ]; then
echo "myssh dev|pro alias"
return
fi
param_alias=$2
if [ "pro" = "$param_env" ]; then
env_dict=("${pro_dict[@]}")
elif [ "dev" = "$param_env" ]; then
env_dict=("${dev_dict[@]}")
fi
for ((i=0; i<${#env_dict[@]}; i++)) do
read name alias host password <<< "${env_dict[$i]}"
if [ -z "$param_alias" ]; then
echo "$name myssh $param_env $alias"
fi
if [ "${alias}" = "$param_alias" -a $param_alias ]; then
echo "$name ssh $host"
echo "阿里云首次登录需要使用ssh先连接一次(ssh root@IP)"
echo "ssh $host $password"
sshpass -p $password ssh $host
fi
done
}
function myscp() {
param_env=$1
if [ -z $param_env ]; then
echo "myscp dev|pro alias -u|-d /source /target [-r]"
return
fi
param_alias=$2
# 来源目录
param_source=$4
# 目标目录
param_target=$5
# -u 上传 -d 下载
param_upload_or_download=$3
# -r 目录
param_is_dir=$6
if [ "pro" = "$param_env" ]; then
env_dict=("${pro_dict[@]}")
elif [ "dev" = "$param_env" ]; then
env_dict=("${dev_dict[@]}")
fi
for ((i=0; i<${#env_dict[@]}; i++)) do
read name alias host password <<< "${env_dict[$i]}"
if [ -z "$param_alias" ]; then
echo "$name myscp $param_env $alias -u ~/Desktop /home/"
echo "$name myscp $param_env $alias -d /home/ ~/Downloads"
fi
if [ "${alias}" = "$param_alias" -a $param_upload_or_download ]; then
if [ "$param_upload_or_download" = "-u" ]; then
echo "$name [$param_source] => [$host:$param_target]"
_scp_upload $host $password $param_source $param_target $param_is_dir
elif [ "$param_upload_or_download" = "-d" ]; then
echo "$name $host [$host:$param_source] => [$param_target]"
_scp_download $host $password $param_source $param_target $param_is_dir
fi
fi
done
}
注: 密码字符串如果含有 $ 特殊字符,则需要用转义字符 \ $ 替代
别名用法
帮助命令
myssh
# 输出结果 myssh dev|pro alias
myscp
# 输出结果 myscp dev|pro alias -u|-d /source /target [-r]
列出当前配置连接信息
# 列出所有测试环境
myssh dev
myscp dev
# 列出所有生产环境
myssh pro
myscp pro
- 输出结果
测试环境1 myssh dev csapp1
测试环境2 myssh dev csapp2
# 或
测试环境1 myscp dev csapp1 -u ~/Desktop /home/
测试环境2 myscp dev csapp2 -d /home/ ~/Downloads
SSH连接
# ssh连接测试环境csapp1服务器
myssh dev csapp1
# ssh连接测试环境csapp2服务器
myssh dev csapp2
SCP上传文件或目录
# 上传文件到csapp1服务器home目录下
myscp dev csapp1 -u ~/Desktop/filename /home/
# 上传目录到csapp1服务器home目录下
myscp dev csapp1 -u ~/Desktop/dir /home/ -r
SCP下载文件或目录
# 下载csapp1服务器home目录下filename文件到本地Downloads目录
myscp dev csapp1 -d /home/filename ~/Downloads
# 下载csapp1服务器home目录下dir目录到本地Downloads目录
myscp dev csapp1 -d /home/dir ~/Downloads -r