如何通过bash脚本将ssh密钥添加到主机

时间:2016-09-23 21:41:36

标签: bash ssh expect ssh-keys

我一直在尝试自动创建用户和配置ssh访问。

到目前为止,我创建了一个访问主机并通过expect创建新用户的脚本,如下所示:

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 root@000.00.00.00 ""
couldn't read file "<ssh .pub key content> ...

我也试过了:

cat $ssh_key | ssh $user@$ip "cat >> /home/$new_user/.ssh/authorized_keys"

没有成功,我只能让密码查询闪烁,我无法用最后一种方法连接期望。

1 个答案:

答案 0 :(得分:2)

我将忽略这里的大问题,并专注于你的问题。 (更大的问题:不要在这里使用expect - 如果您依赖sshpass而非可以极大地简化此脚本。

现在,当你关闭单引号时,你没有开始任何其他类型的报价。这意味着当您使用空格替换变量时,您将结束传递给-c的{​​{1}}参数。

而不是这样做:

expect

这样做:

'foo'$bar'baz'

...所以你的脚本看起来更像是:

'foo'"$bar"'baz'

但是,在完全避免这种情况方面,请考虑以下内容:

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