密钥登录服务器
密钥登录服务器
目的:在我们使用cmd登录服务器的时候每次都要输一遍ip, port, key,未来方便使用,我们尝试使用密钥登录,无需每次都输入密码。
方法:
首先登录到服务器。
创建 .ssh 目录(如果已有根目录下已有 .ssh 目录则跳过)。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
创建authorized_keys
文件(如果已有则跳过)。
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 用于更改权限。
创建密钥,在Terminal中输入
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
意思是生成一个rsa类型的ssh密钥,然后将公钥添加到authorized_keys中,具有相应私钥的用户就能通过ssh访问服务器。输入后一路回车,最后会在你的根目录下的.ssh
文件夹中生成一组ssh密钥。你可以重命名方便记忆,也可使用默认的。
id_rsa : 私钥
id_rsa.pub : 公钥
最后生成密钥,如图所示。
将私钥下载到本地的 C:\Users\xxx\.ssh
目录。Windows 下通常密钥都放在该文件夹下,便于管理,也可以放在自己记得的其他目录下。
在 Windows 本地的 cmd 使用私钥进行连接,即可无需密码登录成功。
ssh username@server_address -p port -i private_key_address
private_key_address 就是你在本地保存私钥的文件路径
使用脚本快捷登录
每次输入一长串指令略微耗时,使用脚本登录更快。桌面新建一个txt文件,文件内容为:
@echo off
ssh xxx@server.ip -p xxx -i C:\Users\xxx\.ssh\id_rsa
保存并退出重命名文件为login_server.bat
,下次就可以直接双击脚本文件快速登录了。
BUG
-
在使用私钥登录时仍然提示你需要输入密码
解决方法:
chmod go-w ~ chmod 644 ~/.ssh/authorized_keys
关键是第二行命令。但是网上也有人使用600就可以运行。原因:ssh tunneling requests may require that file to have 644 specifically. I've always connected ok with 600 with ssh keys with basic terminal connection to my server. But for fancier applications, port-forwarding, ProxyCommand, etc. you may need group or world read permissions on the file, or the remote file... or ... as needed.
Supplementary
Linux命令解释
~
# 波浪号表示当前用户的主目录,例如~/.ssh 就表示 /home/xxx/.ssh
~
touch
touch 命令用于修改文件或者目录的时间属性(包括存取和修改时间)。若文件不存在则系统会建立一个新的文件。
touch [ -acfm][ -d<date & time>][ -r<reference file or dir>][ -t<date & time>][--help][--version][file or dir]
a--改变档案的读取时间记录
c--假如目的档案不存在则不会建立新的档案,与--no-create的效果一样
f--不使用,为了与其他unix系统的相容性而保留
m--改变档案的修改时间记录
d--设定时间与日期,可以使用各种不同的格式
r--使用参考档的时间记录,与--file效果一样
t--设定档案的时间记录,格式与date指令相同
--no-create 不会建立新的档案
--help 列出指令格式
--version 列出版本信息
ls -l 命令可以显示档案的时间记录
ls -l
例子
$ ls -l id_rsa
-rw-------. 1 1679 3月 20 16:13 id_rsa
$ touch id_rsa # 修改文件时间属性为当前系统时间
$ ls -l id_rsa
-rw-------. 1 1679 3月 20 17:10 id_rsa
$ touch test # 创建一个名为test的文件
$ ls
authorized_keys id_rsa id_rsa.pub test
mkdir
mkdir 命令即 make directory ,用于创建目录。用法:
mkdir [-p] dir_name
-p : 确保目录名称存在,不存在就新建一个。如果不加-p且原本目录就不存在则产生错误。
cat
cat 命令即 concatenate,用于连接文件并打印到标准输出设备上。用法:
cat [-AbeEnstTuv] [--help][--version] fileName
-n or --number : 由1开始对所有输出的行数编号
-b or --number-noblank : 和-n相似只是不对空白行编号
-s or --squeeze-blank : 当遇到有两行以上的空白行就代换为一行空白行
-v or --show-nonprinting : 使用^和 M- 符号,除了LFD和TAB外
-E or --show-ends : 在每一行结束处显示$
-T or --show-tabs : 将TAB字符显示为^l
-A or -- show-all : 等价于 -vET
-e : 等价于 -vE
-t : 等价于 -vT
例子
# 把testfile1的文档内容加上行号后输入到testfile2这个文档中
cat -n testfile1 > testfile2
# 清空test.txt内容
cat /dev/null > /etc/test.txt
chmod
chmod 命令即 change mode,用于空值用户对文件的权限。
Linux/Unix 的文件调用权限分为三级:文件所有者Owner,用户组Group,其他用户Other Users
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人。a表示这三者都是。
mv
mv 命令即 move file ,用来为文件或目录改名,或将文件或目录移入其他位置。语法如下
mv [options] source dest
mv [options] source... directory
-b : 当目标文件或目录存在时,在执行覆盖前会为其创建一个备份。
-i : 如果指定移动的源目录或文件与目标的目录或文件同名时,则会先询问是否覆盖旧文件,输入y表示直接覆盖,输入n表示取消该操作
-f : 如果指定移动的源目录或文件与目标目录或文件同名,不会询问直接覆盖。
-n : 不要覆盖任何已存在的文件或目录
-u : 当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
mv old_filename new_filename
使用
mv
命令重命名文件可能会覆盖同名的目标文件,谨慎操作。如果目标目录中已有同名文件,则会重命名失败
mv
命令同样适用于移动文件,所以在重命名时,请确保文件仍然在相同的文件系统中,否则将执行移动操作。
authorized_keys
authorized_keys文件用于存储允许通过SSH访问特定用户账户的公钥。当用户尝试通过SSH连接到服务器时,服务器会使用此文件中的公钥验证用户身份,如果公钥匹配用户将被允许访问,有助于提高安全性。其文件通常位于用户的主目录下的.ssh
子目录中,其作用范围仅限于其所属的用户账户。
某些情况下,authorized_keys文件可能会存放在其他目录,如/root/.ssh/
,这通常是原文这些目录属于特定的用户或系统管理员,需要允许其他用户或服务访问。用户可以在任何地方创建authorized_keys
文件,但为了保持良好的组织和安全实践,建议将其放在用户的.ssh
目录中。如果你在其他目录创建 authorized_keys
文件,你需要确保 SSH 配置文件(通常是 /etc/ssh/sshd_config
)中的 AuthorizedKeysFile
指令指向了正确的文件路径。
known_hosts & known_hosts.old
know_hosts
和know_hosts.old
是SSH客户端中的文件,用于存储已知主机的公钥信息。
know_hosts
: 该文件包含了用户曾经连结过的远程主机的公钥信息,当用户首次连接一个远程主机时,SSH客户端将会在该主机的公钥保存在know_hosts
文件中,当下次再次连接该主机时,客户端会验证主机的公钥是否与之前保持一致,以防止中间人攻击。如果主机的公钥发生变化,客户端会发出警告,以提醒用户进行确认。know_hosts.old
: 当SSH客户端检测到known_hosts
文件发生了变化(比如主机公钥发生了更改)时,它会将原始的known_hosts
文件备份为known_hosts.old
。这样,您可以在需要时恢复到旧的已知主机配置。