1 背景及目的
开发编译好的代码不能在本地运行,需要通过scp传输到实验板上跑。且中间还要经过一次跳板机的中转传输,过于繁琐,浪费一部分开发时间。尝试编写脚本以减少开发中通过scp命令传输时的工作。
2 过程
2.1 编写脚本
编写脚本如下
#!/bin/bash
usr_target_host="U1@I1"
local_dir_dir="P1"
target_dir_dir="P2"
local_dir_lib="P3"
target_dir_lib="P4"
if [ "$#" -lt 2 ]; then
echo "Usage: $0 <dir_flag> <lib_flag>"
echo " dir_flag: 1 to copy directory"
echo " lib_flag: 1 to copy library"
exit 1
fi
dir_flag=$1
lib_flag=$2
if [ "$dir_flag" == "1" ]; then
scp -r $local_dir_dir/D1 $usr_target_host:$target_dir_dir
fi
if [ "$lib_flag" == "1" ]; then
scp $llocal_dir_lib/L1 $usr_target_host:$target_dir_lib
fi
解释每一段的含义:
#!/bin/bash
表示这是一个Bash脚本文件,让计算机使用Bash脚本文件的规则来理解此文件。
usr_target_host="U1@I1"
目标host的用户名及IP,将U1替换为你要传输到的远端的用户名,I1替换对需要传输到的远端的IP。
local_dir_dir="P1"
target_dir_dir="P2"
local_dir_lib="P3"
target_dir_lib="P4"
local_XX
:要传输的文件来源的路径。
target_XX
:要传输的文件去向的路径。
因为使用编写的动态库,所以要同时传输不同路径下的生成文件夹和库到不同的路径。如果一次只需要传输一份文件,一个路径即可。
if [ "$#" -lt 2 ]; then
echo "Usage: $0 <dir_flag> <lib_flag>"
echo " dir_flag: 1 to copy directory"
echo " lib_flag: 1 to copy library"
exit 1
fi
运行时的输入选项,接受两个参数。
第一个参数为1代表需要传输文件夹。
第二个参数为1代表需要传输文件。
如果参数不满足则退出。
添加输入参数功能是因为,文件夹传输的时间花费远大于库传输的时间,当只需要传输库时会浪费大量的事件在传输文件夹上。如果无此需求,可省略。
dir_flag=$1
lib_flag=$2
用两个变量接收输入的参数。如果无输入参数的需求,可省略。
if [ "$dir_flag" == "1" ]; then
scp -r $local_dir_dir/D1 $usr_target_host:$target_dir_dir
fi
if [ "$lib_flag" == "1" ]; then
scp $llocal_dir_lib/L1 $usr_target_host:$target_dir_lib
fi
通过对输入参数的判断,选择是否执行对应的scp命令。
将D1或L1替换为需要传输文件的具体的文件名。
通过scp传输文件夹需要增加-r选项。
如果一次只需要传输一份文件,一个scp命令即可。
当需求不复杂,只需要通过脚本一次传输一份文件,可简化为:
#!/bin/bash
usr_target_host="U1@I1"
local_dir="P1"
target_dir="P2"
scp $local_dir/F1 $usr_target_host:$target_dir
2.2 设置ssh密钥对登录
在编写好脚本后运行,会需要登录密码。可以通过设置密钥对登录的方式来规避对密码的输入
客户端设置
生成ssh密钥对,在终端输入:
ssh-keygen -t rsa
使用默认文件夹,安全要求不高的环境,建议不设置密码。
将公钥复制到远程服务器。在终端输入:
ssh-copy-id U@I
U代表远端服务器用户名,I代表远端服务器IP。
这里需要输入一次远端服务器的密码。
此时客户端的设置就完成了。
有设置成功的提示后,可尝试ssh指令进行登录。如果登录不成功,说明还需要对远端服务器端进行修改。
服务器设置
登录远端服务器,修改/etx/ssh
下的sshd_config
文件。
添加:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
检查~/.ssh
下的authorized_keys
文件夹是否存在客户端添加好的密钥。
服务器端的设置也完成了。
可以尝试运行脚本传输文件。
3 建议
建议1
在对服务器端进行修改时,将原sshd_config
进行一次备份,且最好保留一个连接上远端服务器的终端作为备用。同时与同事或同学沟通一下,确保在修改的过程中远端服务器不会被关闭或重启(如果使用了跳板机,也需要保证跳板机不会被关闭或者重启),防止在设置的过程中,因sshd_config
修改不当,导致无法通过ssh登录再次修改sshd_config
的问题。每次修改完sshd_config
后,开启新的终端尝试ssh能否不需要密码进行登录。若无法登录,则赶紧将sshd_config
还原,再去排查问题。
建议2
在对服务器端修改完后,需要修改各级文件夹权限:
- 修改
.ssh/authorized_keys
文件权限不高于600 - 修改
.ssh
目录权限不高于700 - 修改
.ssh
上级目录权限不高于755