2016-09-23 17 views
0

私は、ユーザーの作成とsshアクセスの設定を自動化しようとしています。bashスクリプトを使ってホストにsshキーを追加する方法

これまでのところ、私はホストにアクセスするスクリプトを作成し、以下のように、期待を経由して新規ユーザーを作成します。

expect -c ' 
spawn ssh '$user'@'$ip'; 
expect "assword: "; 
send "'$passwd'\r"; 
expect "prompt\n"; 
send "adduser '$new_user'\r"; 
... 
send "mkdir /home/'$new_user'/.ssh\r"; 
expect "prompt\n"; 
send "exit\r"; 
' 

これは正常に動作し、その後、私は認可に.pubファイルキーファイルを追加する必要がありますキーファイルは、どこに始まったのですか?

私が試した:

ssh_key='/home/.../key.pub' 
content=$(cat $ssh_key) 
expect -c ' 
spawn ssh '$user'@'$ip' "echo '$content' >> /home/'$new_user'/.ssh/authorized_keys; 
expect "password:"; 
... 
' 

をして得た:

missing " 
    while executing 
"spawn ssh [email protected] "" 
couldn't read file "<ssh .pub key content> ... 

私も試してみました:

cat $ssh_key | ssh [email protected]$ip "cat >> /home/$new_user/.ssh/authorized_keys" 

を成功せず、私はパスワードのみのクエリは、私がすることはできません、点滅しますexpectをこの最後のメソッドに接続します。

+0

あなたはhttp://shellcheck.net/を使用する習慣をつくるかもしれません。あなたのバグに遭遇したでしょう。 –

答えて

2

私はここで大きな問題を無視し、具体的にあなたの質問に焦点を当てます。 (です)より大きな問題:ここではexpectを使用しないでください。sshpassに頼る場合は、このスクリプトを大幅に簡略化できます)。

今のところ、一重引用符を閉じると、他の種類の引用符は開始されません。つまり、空白で変数を代入すると、expectに渡された-c引数が終了します。

代わりにこれを行う:

の面では
ssh_key='/home/.../key.pub' 
content=$(<"$ssh_key") 
expect -c ' 
spawn ssh '"$user"'@'"$ip"' "echo '"$content"' >> /home/'"$new_user"'/.ssh/authorized_keys; 
expect "password:"; 
... 
' 

:ので、あなたのスクリプトは、より多くのようになります...

'foo'"$bar"'baz' 

'foo'$bar'baz' 

これを行いますこれをすべて避けてください次のようにしてください:

#!/bin/bash 
#  ^^^^- NOT /bin/sh 

content=$(<"$ssh_key") # more efficient alternative to $(cat ...) 

# generate shell-quoted versions of your variables 
# these are safe to substitute into a script 
# ...even if the original content contains evil things like $(rm -rf /*) 
printf -v content_q '%q' "$content" 
printf -v new_user_q '%q' "$new_user" 

# use those shell-quoted versions remotely 
sshpass -f"$password_file" ssh "$host" bash -s <<EOF 
adduser ${new_user_q} 
printf '%s\n' ${content_q} >>/home/${new_user_q}/.ssh/authorized_keys 
EOF 
関連する問題