在Bash中为用户身份验证创建SSH密钥对以进行用户身份验证

时间:2019-08-10 14:36:21

标签: bash ssh expect

我尝试了以下步骤来设置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

为什么以及如何解决?

2 个答案:

答案 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之前使用现有工具寻找非(或更少)交互式解决方案。