-
A 主机要与B 主机的账户user01 建立SSH信任关系,即A使用SSH协议,user01用户登录到B时无需使用密码,
-
一些使用SSH协议的命令也无需输入密码,如scp。
-
-
脚本要在A主机上执行,执行以下命令行:
-
ssh ssh_set_pubkey.sh -n B -u user01
-
-
代码的主要使用ssh工具在A主机本地生成公钥和私钥,然后把公钥写入到B主机用户user01主目录的.ssh/id_rsa.pub文件中。
下面的Shell脚本中增加了许多设置执行环境的代码,是为了脚本更加规范,可移植和安全。
或者也可以写成函数的形式,方便在其他脚本中调用:
-
##! @TODO : create trust relationship between local host and remote host
-
##! @IN : $1 => remote hostname or ip
-
##! @IN : $2 => remote host username
-
function createTrustRelationship(){
-
local l_remote_host="$1"
-
local l_remote_user="$2"
-
-
local l_home_dir="$(cd ${HOME}; pwd)"
-
local l_private_key_file="${l_home_dir}/.ssh/id_rsa"
-
local l_public_key_file="${l_home_dir}/.ssh/id_rsa.pub"
-
-
local l_curr_time=$(date "+%Y%m%d_%H%M%S")
-
# backup
-
if [ -f "${l_private_key_file}" ]
-
then
-
mv "${l_private_key_file}" "${l_private_key_file}_${l_curr_time}"
-
fi
-
if [ -f "${l_public_key_file}" ]
-
then
-
mv "${l_public_key_file}" "${l_public_key_file}_${l_curr_time}"
-
fi
-
-
# generate key and sync to server
-
ssh-keygen -t "rsa" -N "" -f ${l_private_key_file} >/dev/null
-
-
if command -v ssh-copy-id >/dev/null 2>&1
-
then
-
ssh-copy-id -i ${l_public_key_file} ${l_remote_user}@${l_remote_host}
-
else
-
# ~/.ssh 必须存在,而且权限必须是 700,本机的私钥的权限必须设置成600
-
ssh ${l_remote_user}@${l_remote_host} "mkdir -p ~/.ssh; chmod 700 ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh/authorized_keys" <${l_public_key_file} >/dev/null 2>&1
-
fi
-
}
以上是 Shell 中常用的功能实现形式:
脚本形式,既可以单独执行,也可以其他脚本中,作为命令行的形式直接调用,一般是以子进程的形式执行的,执行完即退出。
函数形式,它不能单独执行,使用前必须以 source 的方式加载进当前的脚本执行环境,自加载后,在整个脚本的执行过程中都存在。
不同的执行方式,会产生差别:
子进程执行的形式有自己的进程空间,不能操作父进程的变量,父子进程要交换信息,就需要使用进程间的通信机制,处理起来会更加复杂。
而函数形式,主脚本的执行环境可能会对函数的执行产生影响,而函数的执行也可能改变脚本的执行环境。
另外,调试时在主脚本使用sh -x,对在主脚本中调用的其他脚本是无效,如果要连带调试这些脚本,需要在这些脚本的开头#! /bin/sh
后面也加上 -x 选项。
因此,如果只是实现整个脚本中的部分功能,建议写成函数的形式。
问题:
1.在使用过程中,有一次发现脚本执行完成,还未建立信任关系成功,
结果查明,是服务端的机器没有创建 ~/.ssh目录,所以在上面的脚本中增加了创建 目录 以及赋权限的操作,问题解决。
阅读(2227) | 评论(0) | 转发(0) |