我尝试了以下步骤来设置ssh无密码(SSH密钥对身份验证)登录。
在bash中设置IP和端口。
ip="xxxx"
port="xxxx"
在客户端设置ssh配置文件
cat > $HOME/.ssh/config <<EOF
Host $ip
IdentityFile $HOME/.ssh/id_rsa
User root
EOF
在客户端创建ssh密钥对
ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -q -b 2048 -N ""
从客户端将id_rsa推入ssh服务器。
准备ssh服务器
ssh -p $port root@$ip "mkdir -p /root/.ssh"
将授权文件推送到ssh服务器
scp -P $port id_rsa.pub root@$ip:/root/.ssh/authorized_keys
设置授权文件的权限
ssh -p $port root@$ip "chmod 700 .ssh; chmod 640 .ssh/authorized_keys"
成功!
现在我想将所有步骤写到该工作的一键式bash脚本中。
这是我的尝试。
#! /bin/bash
ip="xxxx"
port="xxxx"
pass="yyyy"
cat > $HOME/.ssh/config <<EOF
Host $ip
IdentityFile $HOME/.ssh/id_rsa.bwg_root
User root
EOF
ssh-keygen -t rsa -f $HOME/.ssh/id_rsa.bwg_root -q -b 2048 -N ""
cd $HOME/.ssh
/usr/bin/expect <<EOF
spawn ssh -p $port root@$ip "mkdir -p /root/.ssh"
expect "password:"
send "$pass\r"
spawn scp -P $port id_rsa.pub root@$ip:/root/.ssh/authorized_keys
expect "password:"
send "$pass\r"
spawn ssh -p $port root@$ip "chmod 700 .ssh; chmod 640 .ssh/authorized_keys"
expect "password:"
send "$pass\r"
EOF
它获得了以下输出信息:
spawn ssh -p xxxx root@yyyy mkdir -p /root/.ssh
root@yyyy's password: spawn scp -P xxxx id_rsa.bwg.pub root@yyyy:/root/.ssh/authorized_keys
root@yyyy's password: spawn ssh -p xxxx root@yyyy chmod 700 .ssh; chmod 640 .ssh/authorized_keys
为什么以及如何解决?
答案 0 :(得分:2)
我用sshpass
进行了简化。
#!/bin/bash
ip="x.x.x.x"
port="xx"
export SSHPASS="yyy"
cat >$HOME/.ssh/config <<EOF
Host $ip
IdentityFile $HOME/.ssh/id_rsa.bwg_root
User root
EOF
ssh-keygen -t rsa -f "$HOME/.ssh/id_rsa.bwg_root" -q -b 2048 -N ""
cd "$HOME/.ssh" || exit 1
sshpass -e ssh -oStrictHostKeyChecking=no -p "$port" "root@$ip" "mkdir -p -m 700 /root/.ssh"
sshpass -e scp -oStrictHostKeyChecking=no -P "$port" id_rsa.bwg_root.pub "root@$ip:/root/.ssh/authorized_keys"
sshpass -e ssh -oStrictHostKeyChecking=no -p "$port" "root@$ip" "chmod 640 .ssh/authorized_keys"
顺便说一句:我用id_rsa.pub
替换了最后一个id_rsa.bwg_root.pub
,并将-m 700
添加到mkdir
并删除了chmod 700 .ssh
。
答案 1 :(得分:2)
使用ssh-copy-id
将新密钥推入远程主机。当然,您需要输入那个登录的密码,但这是您最后一次使用它。
#!/bin/bash
ip="x.x.x.x"
port="xx"
id_file=$HOME/.ssh/id_rsa_$ip
cat > $HOME/.ssh/config <<EOF
HOST $ip
IdentityFile $id_file
User root
EOF
ssh-keygen -t rsa -f "$HOME/.ssh/id_rsa_$ip" -q -b 2048 -N ""
ssh-copy-id -i "$id_file" -p "$port" root@"$ip"
通常,总是在尝试except
之前使用现有工具寻找非(或更少)交互式解决方案。