歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux命令ssh-copy-id

Linux命令ssh-copy-id

日期:2017/2/28 13:48:29   编辑:Linux教程

在N多年前,搭建Oracle RAC環境的時候,其中有一項非常艱巨的任務就是配置節點服務器的互信關系,每次到了這個部分的時候就有點暈,因為文件需要在兩個節點間拷過來,拷過去。每次到了這個部分,就需要打開我的攻略筆記,然後嚴格按照上面的步驟來完成。到了OCM考試的時候,當時Oracle是提供了一個建立互信關系的腳本,直接運行即可。搭建的過程省事不少。到了11g的RAC搭建中,在檢查項中有一個就是建立互信關系,只需要在界面上點擊即可完成。可見互信關系的建立過程是越來越簡化了。

當然回到工作環境中,如果兩台服務器需要建立互信關系,那麼需要做的就是拷貝秘鑰信息,這個工作就得手工來完成,有時候感覺真是麻煩,但是又無可奈何。

一般建立單向信任關系的步驟如下:

1)檢查是否有秘鑰生成,如果沒有則使用ssh-keygen -t rsa來生成即可。

2)拷貝id_rsa.pub的信息,稍後使用。

3) ssh連接到目標服務器,然後到.ssh/authorized_keys文件中添加拷貝的id_rsa.pub的內容即可

4)退出當前窗口,重新登錄驗證,是否可以無密碼通信

最近還是看到ssh-copy-id這個神器,看完之後有一種全然一新的感覺,感覺我們之前的處理似乎還是有些老套了。ssh-copy-id可以直接運行這一個命令即可完成上面的步驟,所以這個命令確實是個好東西,難得的是這個命令本身是個shell腳本,所以索性拿來學學。

腳本的內容如下:

#!/bin/sh

# Shell script to install your public key on a remote machine
# Takes the remote machine name as an argument.
# Obviously, the remote machine must accept password authentication,
# or one of the other keys in your ssh-agent, for this to work.

ID_FILE="${HOME}/.ssh/id_rsa.pub"

if [ "-i" = "$1" ]; then
shift
# check if we have 2 parameters left, if so the first is the new ID file
if [ -n "$2" ]; then
if expr "$1" : ".*\.pub" > /dev/null ; then
ID_FILE="$1"
else
ID_FILE="$1.pub"
fi
shift # and this should leave $1 as the target name
fi
else
if [ x$SSH_AUTH_SOCK != x ] ; then
GET_ID="$GET_ID ssh-add -L"
fi
fi

if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then
GET_ID="cat ${ID_FILE}"
fi

if [ -z "`eval $GET_ID`" ]; then
echo "$0: ERROR: No identities found" >&2
exit 1
fi

if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
exit 1
fi

{ eval "$GET_ID" ; } | ssh $1 "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)" || exit 1

cat <<EOF
Now try logging into the machine, with "ssh '$1'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

EOF

其實看完之後,發現裡面確實有不少的內容,命令格式,新的命令都值得學習。

shift是個蠻有意思的命令,可以在不知道位置變量個數的情況下,還能逐個把參數一一處理。
restorecon命令用來恢復SELinux文件屬性即恢復文件的安全上下文。

整個腳本中花了大篇幅來處理輸入參數,可以手工指定秘鑰文件,還有擴展名補全的功能。比如調用腳本的方式如下:
ssh-copy-id -i aaa [email protected]
這種情況下,腳本會把aaa自動補全擴展名,腳本就會查找aaa.pub的秘鑰文件。
裡面最核心的是下面的一句,運行後會提示輸入密碼。
$ { eval "$GET_ID" ; } | ssh 10.127.133.125 "umask 077;test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)" || exit 1
[email protected]'s password:
可以看到整個腳本有很多需要考慮的細節,值得玩味。
當然大道至簡,這個腳本的本質就是傳輸id_rsa.pub並不會自動幫你去生成id_rsa.pub,最核心的功能就是把秘鑰信息寫入.ssh/authorized_keys中。
所以整個過程的簡化版思路就是下面的一個類似的命令形式。
$ echo "aaaaa"|ssh 10.127.133.125 "cat"
[email protected]'s password:
aaaaa
echo "aaaaa"會輸出秘鑰信息,然後通過管道作為ssh到目標端的參數值調用
所以這個過程也完全可以自己定義命令來完成。
明白了這些,很多工具就會脫離開神聖的外衣,而對於我們來說,明白了核心的部分,就需要學習哪些場景沒有考慮周到,不斷去補充,不斷完善。

Copyright © Linux教程網 All Rights Reserved