我一直在尝试自动创建用户和配置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"
没有成功,我只能让密码查询闪烁,我无法用最后一种方法连接期望。
答案 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:";
...
'