Products
GG网络技术分享 2025-03-18 16:14 52
在 Linux 系统上设置一个允许你无需密码即可远程登录或运行命令的帐户并不难,但是要使它正常工作,你还需要掌握一些繁琐的细节。在本文,我们将完成整个过程,然后给出一个可以帮助处理琐碎细节的脚本。
设置好之后,如果希望在脚本中运行 ssh 命令,尤其是希望配置自动运行的命令,那么免密访问特别有用。
需要注意的是,你不需要在两个系统上使用相同的用户帐户。实际上,你可以把公用密钥用于系统上的多个帐户或多个系统上的不同帐户。
设置方法如下。
首先,你需要从要发出命令的系统上着手。那就是你用来创建 ssh 密钥的系统。你还需要可以访问远程系统上的帐户并在其上运行这些命令。
为了使角色清晰明了,我们将场景中的第一个系统称为 “boss”,因为它将发出要在另一个系统上运行的命令。
因此,命令提示符如下:
boss$
如果你还没有在 boss 系统上为你的帐户设置公钥/私钥对,请使用如下所示的命令创建一个密钥对。注意,你可以在各种加密算法之间进行选择。(一般使用 RSA 或 DSA。)注意,要在不输入密码的情况下访问系统,你需要在下面的对话框中的两个提示符出不输入密码。
如果你已经有一个与此帐户关联的公钥/私钥对,请跳过此步骤。
boss$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/myself/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <== 按下回车键即可
Enter same passphrase again: <== 按下回车键即可
Your identification has been saved in /home/myself/.ssh/id_rsa.
Your public key has been saved in /home/myself/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:1zz6pZcMjA1av8iyojqo6NVYgTl1+cc+N43kIwGKOUI myself@boss
The key's randomart image is:
+---[RSA 3072]----+
| . .. |
| E+ .. . |
| .+ .o + o |
| ..+.. .o* . |
| ... So+*B o |
| + ...==B . |
| . o . ....++. |
|o o . . o..o+ |
|=..o.. ..o o. |
+----[SHA256]-----+
上面显示的命令将创建公钥和私钥。其中公钥用于加密,私钥用于解密。因此,这些密钥之间的关系是关键的,私有密钥绝不应该被共享。相反,它应该保存在 boss 系统的 .ssh 文件夹中。
注意,在创建时,你的公钥和私钥将会保存在 .ssh 文件夹中。
下一步是将公钥复制到你希望从 boss 系统免密访问的系统。你可以使用 scp 命令来完成此操作,但此时你仍然需要输入密码。在本例中,该系统称为 “target”。
boss$ scp .ssh/id_rsa.pub myacct@target:/home/myaccount
myacct@target's password:
你需要安装公钥在 target 系统(将运行命令的系统)上。如果你没有 .ssh 目录(例如,你从未在该系统上使用过 ssh),运行这样的命令将为你设置一个目录:
target$ ssh localhost date
target$ ls -la .ssh
total 12
drwx------ 2 myacct myacct 4096 Jan 19 11:48 .
drwxr-xr-x 6 myacct myacct 4096 Jan 19 11:49 ..
-rw-r--r-- 1 myacct myacct 222 Jan 19 11:48 known_hosts
仍然在目标系统上,你需要将从“boss”系统传输的公钥添加到 .ssh/authorized_keys 文件中。如果该文件已经存在,使用下面的命令将把它添加到文件的末尾;如果文件不存在,则创建该文件并添加密钥。
target$ cat id_rsa.pub >> .ssh/authorized_keys
下一步,你需要确保你的 authorized_keys 文件权限为 600。如果还不是,执行命令 chmod 600 .ssh/authorized_keys。
target$ ls -l authorized_keys
-rw------- 1 myself myself 569 Jan 19 12:10 authorized_keys
还要检查目标系统上 .ssh 目录的权限是否设置为 700。如果需要,执行 chmod 700 .ssh 命令修改权限。
target$ ls -ld .ssh
drwx------ 2 myacct myacct 4096 Jan 14 15:54 .ssh
此时,你应该能够从 boss 系统远程免密运行命令到目标系统。除非目标系统上的目标用户帐户拥有与你试图连接的用户和主机相同的旧公钥,否则这应该可以工作。如果是这样,你应该删除早期的(并冲突的)条目。
使用脚本可以使某些工作变得更加容易。但是,在下面的示例脚本中,你会遇到的一个烦人的问题是,在配置免密访问权限之前,你必须多次输入目标用户的密码。一种选择是将脚本分为两部分——需要在 boss 系统上运行的命令和需要在 target 系统上运行的命令。
这是“一步到位”版本的脚本:
#!/bin/bash
# NOTE: This script requires that you have the password for the remote acct
# in order to set up password-free access using your public key
LOC=`hostname` # the local system from which you want to run commands from
# wo a password
# get target system and account
echo -n "target system> "
read REM
echo -n "target user> "
read user
# create a key pair if no public key exists
if [ ! -f ~/.ssh/id_rsa.pub ]; then
ssh-keygen -t rsa
fi
# ensure a .ssh directory exists in the remote account
echo checking for .ssh directory on remote system
ssh $user@$REM "if [ ! -d /home/$user/.ssh ]; then mkdir /home/$user/.ssh; fi"
# share the public key (using local hostname)
echo copying the public key
scp ~/.ssh/id_rsa.pub $user@$REM:/home/$user/$user-$LOC.pub
# put the public key into the proper location
echo adding key to authorized_keys
ssh $user@$REM "cat /home/$user/$user-$LOC.pub >> /home/$user/.ssh/authorized_ke
ys"
# set permissions on authorized_keys and .ssh (might be OK already)
echo setting permissions
ssh $user@$REM "chmod 600 ~/.ssh/authorized_keys"
ssh $user@$REM "chmod 700 ~/.ssh"
# try it out -- should NOT ask for a password
echo testing -- if no password is requested, you are all set
ssh $user@$REM /bin/hostname
脚本已经配置为在你每次必须输入密码时告诉你它正在做什么。交互看起来是这样的:
$ ./rem_login_setup
target system> fruitfly
target user> lola
checking for .ssh directory on remote system
lola@fruitfly's password:
copying the public key
lola@fruitfly's password:
id_rsa.pub 100% 567 219.1KB/s 00:00
adding key to authorized_keys
lola@fruitfly's password:
setting permissions
lola@fruitfly's password:
testing -- if no password is requested, you are all set
fruitfly
在上面的场景之后,你就可以像这样登录到 lola 的帐户:
$ ssh lola@fruitfly
一旦设置了免密登录,你就可以不需要键入密码从 boss 系统登录到 target 系统,并且运行任意的 ssh 命令。以这种免密的方式运行并不意味着你的帐户不安全。然而,根据 target 系统的性质,保护你在 boss 系统上的密码可能变得更加重要。
via: https://www.networkworld.com/article/3514607/setting-up-passwordless-linux-logins-using-publicprivate-keys.html
作者: Sandra Henry-Stocker 选题: lujun9972 译者: laingke 校对: wxy
本文由 LCTT 原创编译, Linux中国 荣誉推出
这篇文章主要介绍了Linux配置实现免密钥登录过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1.ssh命令
在linux中,可以通过ssh命令来登录另一台服务器。打开两台linux虚拟机,一台Linux01的ip为192.168.226.128,另一台linux02为192.168.226.129,
开机后在linux01终端输入: ssh 192.168.226.129 ,然后会提示输入linux02的登录密码,输入后就可以在linux01上登录linux02了,可以进行命令操作,ssh命令的两种方式
ssh ip地址(默认是root用户) 以root用户的身份登录
ssh 用户名@ip地址以指定用户身份登录
2.免密钥登录解决的问题
现在要想在linux01上登录linux02系统,需要在ssh ip地址后再手动输入密码后才能进入linux02服务器,但是配置免密钥登录后,直接输入ssh命令就可以登录,不在需要手动输入密码。免密钥登录解决了集群之间相互访问受密码的限制。什么是集群?
集群就是很多的服务器干一件事(服务器与服务器之间处于联通状态并且可以传递数据)
3.配置免密钥登录:
只要是在集群中的服务器,都需要配置免密钥,并不是只配置一台,其他机器就可以使用了
3.1在服务器linux01上生成私钥和公钥ssh-keygen -t rsa,然后点击四次回车,不要输入任何密码,否则免密钥失败,看到如下信息配置成功
| +--[ RSA 2048]----+ | .o. | | .E. | | .. . | | o . | | S o .. | | o oooo | | . o.+=. | | .B... | | .+.=+. | +-----------------+ |
3.2在自己的电脑上复制一份公钥同时在其他的服务器上也生成一份,ssh-copy-id 192.168.226.128,ssh-copy-id 192.168.226.129
此过程需要手动输入一次密码,这样就在linux01服务器上和linux02服务器上都放置了一份公钥,通过公钥来实现免密钥登录,看到如下信息配置成功:
| Now try logging into the machine, with \"ssh \'192.168.23.144\'\", and check in: .ssh/authorized_keys to make sure we haven\'t added extra keys that you weren\'t |
3.3在linux01的hosts中配置hostname映射:vim /etc/hosts,
3.4,重复上面的步骤配置linux02,如果有多台服务器,就在复制公钥时在每一台服务器上都复制一份,ip映射也要配置每一台主机的映射,最后测试输入ssh ip地址可以直接登录不需要输密码
文件传输: scp -r 要复制的文件/文件夹 目标ip地址或hostname:目标文件夹路径
如要将linux01上的apps文件夹发送到linux02的home中:scp -r /home/apps 192.168.226.129:/home/ 或 scp -r /home/apps linux02:/home/
就可以传输文件了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Demand feedback