ssh配置
[TOC]
ssh只使用密码登陆
若直接执行下面的命令,
ssh <用户名>@<服务器地址>
# 或
ssh <服务器别名>
出现报错
Received disconnect from <服务器地址> port <端口号>:2: Too many authentication failures
则说明你的添加到钥匙串的ssh密钥太多了(ssh-add -L
可以查看所有钥匙串里的密钥),需要手动指定必须只用密码登陆,方法如下:
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <用户名>@<服务器地址>
# 或
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <服务器别名>
上述参数同样适用于 ssh-copy-id
。
ssh别名、免密登录
别名登陆
本地电脑上,打开~/.ssh/config
文件
vim ~/.ssh/config
编写格式如下
Host 服务器别名1
HostName 服务器ip或网址1
Port 端口号1
User 用户名1
IdentityFile ~/.ssh/id_rsa
Host 服务器别名2
HostName 服务器ip或网址2
Port 端口号2
User 用户名2
IdentityFile ~/.ssh/id_rsa
...
~/.ssh/id_rsa
即为本地私钥
例如
Host myserver
HostName some.place.com
Port 4123
User pitter
IdentityFile ~/.ssh/id_rsa
免密登录
本地电脑上
生成密钥
- 交互模式
ssh-keygen
然后不断回车确认,~/.ssh
下会生成两个文件:id_rsa
(私钥)和id_rsa.pub
(公钥)
若显示已有密钥,问你要不要覆盖,则选不要
- 非交互模式
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa -q # -b 2048 -C "注释"
在~/.ssh/id_rsa
不存在时,运行这个不会产生输出。
在~/.ssh/id_rsa
存在时,运行这不会产生输出
/home/用户名/.ssh/id_rsa already exists. Overwrite (y/n)?
参数说明:
-
-P ""
密码为空 -
-f id_rsa
是指保存文件为~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
-
-q
静默模式,即不产生如下输出,除非报错Generating public/private rsa key pair. Your identification has been saved in /home/用户名/.ssh/id_rsa. Your public key has been saved in /home/用户名/.ssh/id_rsa.pub. The key fingerprint is: SHA256:DasvExxxxxxK//JIqsxxxxxxxxxn4AdbabU 用户名@服务器 The key's randomart image is: +---[RSA 2048]----+ | .. xxxxx xx | |... xxxxx xx | |= xxxxx xx | |ooxx .xxxxxxxxx | |. xxxxx xx . | |. xxxxx x E | |..o xxxxx + | | xxxxx xx | |+ sssddx . | +----[SHA256]-----+
-
-b 位数
默认是 2048,可以指定 1024 等 -
-C 注释
默认为"$USER@$(hostname)"
提供一个新注释,
发送公钥到目标机器
凡可免密访此服务器之私钥,其对应公钥皆保存在~/.ssh/authorized_keys
中。
以下命令可将本地公钥追加到服务器的~/.ssh/authorized_keys
结尾:
ssh-copy-id -o PreferredAuthentications=password -o PubkeyAuthentication=no [-i <公钥或对应私钥路径>] [-p 端口号] 用户名@服务器
或使用别名发送
ssh-copy-id -o PreferredAuthentications=password -o PubkeyAuthentication=no [-i <公钥或对应私钥路径>] 服务器别名
若<公钥或对应私钥路径>
指定,则将本地公钥公钥路径
全文复制,粘贴进服务器的~/.ssh/authorized_keys
文件中。
若<公钥或对应私钥路径>
缺省:
- 若钥匙串为空(即
ssh-add -L
返回为空白),则将~/.ssh/id_rsa.pub
全文黏贴到服务器的~/.ssh/authorized_keys
文件中。 - 若钥匙串不空(即
ssh-add -L
返回有至少一条公钥)则将本地钥匙串中所有公钥的全文(即ssh-add -L
所返回的),都黏贴到服务器的~/.ssh/authorized_keys
文件中。
因此,尽可能手动指定-i <公钥或对应私钥路径>
。
免密登录
本地电脑
ssh [-p <端口号>] <用户名>@<服务器>
或
ssh <服务器别名>
皆可不用输入密码,直接登录
bug
Bad owner or permissions
在执行ssh登录的时候,出现以下错误:
Bad owner or permissions on /home/haowt/.ssh/config
此时只需在~/.ssh/
下执行
sudo chmod 600 config
给config
文件以“600”权限,则可ssh登录
能读取~/.ssh/config
的软件
-
能读取
~/.ssh/config
的软件ssh
,sshfs
,scp
,sftp
,rsync
,在iTerm2上对着远程的文件右键下载文件 -
不能读取
~/.ssh/config
的软件待补充
端口转发
LocalForward | RemoteForward | |
---|---|---|
功能 | 把本地请求转发到远程 | 为把远程请求转发到本地 |
服务进程(多为守护进程) | 在远程 | 在本地 |
访问进程(如浏览器) | 在本地 | 在远程 |
例如 | 本地访问远程的jupiter notebook | 远程用nc发送消息到本地的监听进程 |
ssh config 的写法xxxForward 请求端口 ip:接受端口 |
LocalForward 本地端口 localhost:远程端口 |
RemoteForward 服务器端口 localhost:本机端口 |
ssh 命令的参数 |
-L 本地端口:localhost:远程端口 |
-R 服务器端口:localhost:本机端口 |
跳板连接
以<跳板>
机器为跳板,连接<目标>
机器,需在~/.ssh/config
配置
Host <目标>
HostName <从跳板机访问目标机器用的ip>
User <目标机用户名>
# 登陆目标机永用的私钥所在位置
IdentityFile ~/.ssh/id_rsa
# 允许跳板机用本机私钥登录目标机器
ForwardAgent yes
# 法一: OpenSSH 版本>= 7.3; 或 autossh
ProxyJump <跳板>
# 法二: OpenSSH 版本< 7.3, 不支持以使用ProxyJump, 可使用ProxyCommand; 但autossh不支持用ProxyCommand
# ProxyCommand ssh -q -W %h:%p <跳板>
Host <跳板>
HostName <从本地访问跳板机用的ip>
User <跳板机用户名>
# 登陆跳板机的私钥所在位置
IdentityFile ~/.ssh/id_rsa
这样设置后,以下软件的用法和直接连接目标机器一样
ssh
(包括端口转发功能),sshfs
,scp
,sftp
,rsync
,在iTerm2上对着远程的文件右键下载文件
ssh 重启
linux
重启ssh启服务端
每当修改完ssh服务端的设置文件 /etc/ssh/sshd_config
需要重启ssh服务端服务(即sshd
)
sudo service sshd restart
或
sudo systemctl restart sshd.service
注:systemctl
兼容了 service
, 详见
mac
启动ssh服务端
的较新 Mac 设备都会默认预装 SSH,不过 SSH 守护进程是默认禁用的。今天我们就来一起学习如何通过终端指令来开启和关闭 SSH。
- 是否开启ssh服务端
sudo systemsetup -getremotelogin
# 如果已经开启的话,指令会显示 “Remote Login: On” ,反之就会显示“Remote Login: Off”。
- 开启
sudo systemsetup -setremotelogin on
- 关闭
sudo systemsetup -setremotelogin off
开机自启ssh服务端
mac本身安装了ssh服务,默认情况下不会开机自启
- 开机自启sshd服务:
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
- 开机不自启sshd服务:
sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist
- 查看是否开机自启:
sudo launchctl list | grep ssh
# 如果看到下面的输出表示成功启动了
# - 0 com.openssh.sshd