ssh免密登录

登录远程 linux 主机

ssh user@ip -p port

server(服务器)配置

sudo apt-get install openssh-server
sudo systemctl restart sshd.server

client(客机)配置

# 生成密匙对
ssh-keygen -t rsa -P ""

# 绑定短命令
vim .ssh/config
Host hpc 
  HostName 218.196.248.2
  Port 22
  User ch_cumtlp3

host tx
  hostname 152.136.140.85
  port 22
  user liupei 

host hw
  hostname 139.9.149.252
  port 22
  user liupei 

拷贝 clientid_rsa.pubserver

scp id_rsa.pub ch_cumtlp3@218.196.248.2:

登录sever,并把id_rsa.pub输入到 server 的authorized_keys文件中:

cd .ssh
chmod 600 authorized_keys
cat id_rsa.pub >>.ssh/authorized_keys

此时在 client 中 ssh 登录 sever 无需密码了,scp 复制文件也无需输入密码。

SSH免密登录配置成功后不生效问题,here:目录的属主和权限配置不当。然后上网查找资料得知:SSH不希望home目录和~/.ssh目录对组有写权限,于是执行以下命令进行更改:chmod 755 /home/liupei

ssh x11图形转发

ssh协议可以转发X11数据, 从而达到使用远程gui程序的功能, 假定现在有

客服端 Client :192.168.0.13
服务器 Sever :192.168.0.200

首先确保在客服端 Client 上能够通过 ssh tsfh@192.168.0.200 连接到服务器 Sever, 如果需要使用远程的gui 程序,需要在服务器和客服端上分别做以下配置:

服务器: sudo vim /etc/ssh/sshd_config 修改以下配置,如果在配置文件里面没有找到,就直接添加到文件末尾即可,最后保存退出 :wq

命令行远程图形界面

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost yes

服务器端修改完成后需要执行命令重启sshd服务

    sudo systemctl restart sshd.service

客服端:sudo vim /etc/ssh/ssh_config 同理修改以下配置,保存退出

ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes

客服端修改完成后也需要执行对应的命令重启ssh服务

sudo systemctl restart ssh.service

配置已经修改完了,现在开始连接测试,在客服端 Client 上执行命令

ssh -X tsfh@192.168.0.200 //-X参数表示转发X11数据

现在你已经登陆了服务器,而且还有一个终端是连接的状态,和平时ssh连接没有什么区别,除了会转发 X11 的数据,你可以在终端里面用命令运行你想要运行的 gui 程序比如:firefox , google-chrome , xclock

现在我以 xclock为例演示一下, xclock程序会显示一个图形时钟 here

putty
Host Name - IP: 111.28.189.51
Host Name - Port: 22
Host Name - Saved sessions: c206
Window - Apperance: Font 16-point
Connection - Data - login username: liup
Connection - SSH - X11 - X11 forwarding: enable

修改登录端口

debian

在远程 linux 主机中操作

vi /etc/ssh/sshd_config

#Port 22

#修改为:

Port 60022 #这里修改为你想要设置的端口,以60022为例

修改防火墙配置

vi /etc/sysconfig/iptabels

添加以下规则

-A INPUT -m state --state NEW -m tcp -p tcp --dport 60022 -j ACCEPT

修改完成后,刷新iptables并重启ssh服务

$ systemctl restart iptables.service
$ systemctl restart sshd.service

此时如果再使用22端口进行ssh连接,就会报错,用60022端口连接才可以建立。

fedora

在Fedora上更改SSH端口需通过以下步骤完成,务必保留当前SSH连接不中断,以防配置错误导致无法远程登录:

步骤1:修改SSH配置文件

sudo vi /etc/ssh/sshd_config

找到 #Port 22 行:

  1. 删除行首的 # 取消注释
  2. 22 改为新端口(如 2222
  3. 在下一行添加新端口(双端口过渡更安全):
    Port 22       # 保留原端口(测试后删除)
    Port 2222     # 新增端口
    

步骤2:更新SELinux策略

允许新端口的SSH流量:

sudo semanage port -a -t ssh_port_t -p tcp 2222

📌 若未安装 semanage

sudo dnf install policycoreutils-python-utils

步骤3:配置防火墙

方法1:firewalld(推荐)

sudo firewall-cmd --permanent --add-port=2222/tcp  # 开放新端口
sudo firewall-cmd --permanent --remove-service=ssh # 移除默认SSH(端口22)
sudo firewall-cmd --reload                         # 重载配置

方法2:直接编辑iptables(备用)

sudo iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
sudo iptables-save > /etc/sysconfig/iptables

步骤4:重启SSH服务

sudo systemctl restart sshd

步骤5:验证新端口

新开终端测试连接(确保原会话保持开启):

ssh -p 2222 your_username@server_ip

连接成功后再返回原终端删除 /etc/ssh/sshd_config 中的 Port 22 行,并再次重启SSH:

sudo systemctl restart sshd

关键注意事项:

  1. 端口选择

    • 避免使用已知服务端口(如80/443)
    • 建议范围:1024-49151(如 2222, 3022
    # 检查端口是否占用:
    sudo ss -tuln | grep ':2222'
    
  2. 故障恢复

    • 若配置后无法连接,通过本地控制台登录回滚:
      sudo vi /etc/ssh/sshd_config  # 恢复旧配置
      sudo systemctl restart sshd
      
  3. 安全强化

    # /etc/ssh/sshd_config 追加:
    PermitRootLogin no             # 禁止root登录
    PasswordAuthentication no      # 强制密钥认证
    AllowUsers your_username       # 仅允许特定用户
    

完整操作流程图:

graph LR
    A[修改sshd_config] --> B[SELinux放行端口]
    B --> C[防火墙开新端口]
    C --> D[重启SSH服务]
    D --> E[新终端测试连接]
    E --成功--> F[移除旧端口22]
    F --> G[再次重启SSH]
    G --> H[完成]
    E --失败--> I[通过原连接回滚]

⚠️ 最后检查:运行 sudo systemctl status sshd 确认服务状态,并查看日志 journalctl -u sshd -f 排查错误。

禁止口令登录

为了安全性更高,我们既然已经使用了密钥免密登录,那么就可以直接禁止再使用口令来连接SSH远程主机了。

更改ssh配置

编辑远程服务器上的sshd_config文件:

sudo vim /etc/ssh/sshd_config

修改入下

#PasswordAuthentication yes 改为
PasswordAuthentication no

编辑保存完成后,重启ssh服务使得新配置生效,然后就无法使用口令来登录ssh了

systemctl restart sshd.service

不间断连接

方案一

服务器主动保持连接

编辑 /etc/ssh/sshd_config 文件

ClientAliveInterval 120
ClientAliveCountMax 720

这两项默认是注释的, 您可以使用vi 或者vim编辑器去掉注释,

  • 第一句意思是服务端每间隔 120s 会向客户端发送一个空数据包
  • 第二句表示服务器最大会发送 720 次, 120*720=24 小时,24小时期间连接是不会断开的

然后重启sshd 服务:

systemctl restart sshd

方案二

客户端主动保持连接

编辑~/.ssh/config文件,增加ServerAliveInterval 120

Host jj
    HostName 152.136.140.8
    ServerAliveInterval 120
    User root

每隔 120秒 向服务器发送一个空数据包

ssh远程执行任务

ssh技巧, here,远程执行本地命令,本地命令在远程服务器上执行

执行简单命令

如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样:

ssh nick@xxx.xxx.xxx.xxx "df -h"

那么如何一次执行多条命令呢?其实也很简单,使用分号把不同的命令隔起来就 OK 了:

ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"

执行交互/多行命令

默认情况下,当你执行不带命令的 ssh 连接时,会为你分配一个 TTY。因为此时你应该是想要运行一个 shell 会话。

但是当你通过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会立即退出远程主机,所以需要交互的命令也随之结束。

好在我们可以通过 -t 参数显式的告诉 ssh,我们需要一个 TTY 远程 shell 进行交互!

添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。

u@T470:~$ ssh -t lab 'ls
> pwd
> ls'
 2lab	       deja-dup   Documents   ml2019b   Pictures   Templates  'VirtualBox VMs'
 dataProcess   Desktop	  Downloads   Music     Public	   Videos      work
/home/u
 2lab	       deja-dup   Documents   ml2019b   Pictures   Templates  'VirtualBox VMs'
 dataProcess   Desktop	  Downloads   Music     Public	   Videos      work
Connection to 122.207.150.223 closed.

执行本地的脚本

ssh nick@xxx.xxx.xxx.xxx < test.sh

执行服务器上的脚本

ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"

注意,此时需要指定脚本的绝对路径!

同步文件到服务器

# (压缩到远程) 在A机压缩,并将压缩文件复制到B机
# tar czf - file| ssh server "cat > file.tar.gz"
tar -zcvpf - /boot --exclude=/ | ssh hpc "cd backup/; cat - >boot@$(date +%Y_%m%d).tar.gz"
# (传输到远程) 在A机压缩后,复制到B机器并解压缩
# tar czf - file| ssh server "tar zxf -"
tar -cf - datadir1 | ssh hpc "cd /opt; tar -xf -"

参考文献

在远程执行本地脚本

cat myscript.sh | ssh kramer /bin/sh

root登录

  1. 修改 root 密码:执行命令sudo passwd root
  2. 输入密码:可以和 ubuntu 密码一致,也可以修改 (密码会让你输入两次)
  3. 修改 ssh 配置:执行命令 sudo vim /etc/ssh/sshd_config
  4. 修改 PermitRootLogin:进入 ssh 配置界面后找到 PermitRootLogin,将它后面改为yes / No,保存 (按i进入编辑模式,编辑完esc退出,:w保存当前文件,:q退出)
  5. 重启 ssh 服务:执行命令sudo service ssh restart

查看尝试登录的IP小坏蛋

grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr
拉黑这些IP
cat /var/log/secure | grep "Failed password for invalid user" | awk '{print $13}' | sort | uniq -c | sort -n | tail -10 |awk '{print "sshd:"$2":deny"}' >> /etc/hosts.allow

路由器端口映射局域网

需求分析

多台服务器连在同一个路由器下,其中一台进行认证上网,其他服务器也可以正常上网。但是,路由器下机器的IP均由路由器自动分配,这个IP在外网是无法访问到的(也就是只有连在这个路由器下的机器之间可以相互访问)其他可上网的电脑均访问不到,即使进行上网认证的那台机器也不能被外网访问到。

解决方法
对该路由器下的每台机器进行端口映射(类似内网穿透)

原理

由于路由器的外网IP(入口IP)仅有一个,因此访问此IP是无法找到该路由器下的机器的,但通过为每台机器手动分配一个外部端口后,ssh登录时指定要访问的机器的服务端口,就可以找到路由器下对应的机器,进而登录到电脑。

具体方法

IP与MAC绑定:

防止IP变动:223.198.173.126

img

img

配置端口映射:

  • 查询入口IP:查询该路由器获取到的IP地址,这是用于访问路由器下每台机器的IP地址。

img

配置端口映射:选择【转发规则】->【虚拟服务器】,添加条目,配置内容及解释如下:

服务(外部)端口:用于找到哪台服务器的端口,即ssh访问机器时,需要指定的端口,尽量在9000以上。
内部端口:由于我们要使用ssh登录,因此这里指定ssh登录的默认端口22.
IP地址:由路由器为每台机器分配的IP(内网IP:192.168.1.100)。
协议:选择 “ALL” 即可

img

img

ssh登录命令:

登录命令: ssh username@入口IP -p 端口号
例如:ssh liupei@115.24.161.110 -p 6006

常见问题

每次ssh连接后都需要source

在.bash_profile文件中自动加载.bashrc文件。修改~/.bashrc后终端登录不能自动加载问题 here

vim ~/.bash_profile在文件内部输入
# 加载.bashrc文件
if [ -s ~/.bashrc ]; then
source ~/.bashrc
fi

参考文献:nsnvainva

openssh密匙转ppk

目前有两个主流的密钥格式:OpenSSH格式的密钥 和 PuTTY格式的密钥。

  • id_rsaid_rsa.pub 都是OpenSSH格式的密钥。

    其中id_rsa 是OpenSSH格式的SSH私钥。

    其中id_rsa.pub 是OpenSSH格式的SSH公钥。

  • ppk文件(私匙)

    ppk文件是Putty的私钥。PuTTY Private Key 的缩写。但是ppk文件中同时包含了公钥和私钥,可用记事本打开查看。

  • pem文件(私匙)

    pem表示’privacy enhanced mail’, 文件可以包含任何东西: 具有公共密钥的证书,SSH公钥,公钥私钥,具有公钥私钥的证书。 PEM是一个文本文件,可以用记事本打开。

linux下相互转换(以 ubuntu 为例)

  • 安装putty工具
sudo apt install putty-tools
  • ppk转换为OpenSSH格式

    已知PuTTY格式的ppk密钥 puttykey.ppk

    获取私钥id_rsa

    puttygen /path/to/puttykey.ppk -O private-openssh -o ~/.ssh/id_rsa

    获取公匙id_rsa.pub

    puttygen /path/to/puttykey.ppk -O public-openssh -o ~/.ssh/id_rsa.pub

  • OpenSSH格式转换为ppk

    已知OpenSSH格式的私钥keyname,转换为keyname.ppk

    puttygen keyname -o keyname.ppk

    • openssh 公钥转 pem 格式
      ssh-keygen -f a.pub -e -m a.pem

总结

私钥的格式有PEM, OpenSSH和PPK 3种。公钥的格式有OpenSSH和SSH2两种。

对于私钥,PPK是putty程序用的,这种格式和其它格式的转换通过puttygen来做。puttygen只能import PEM格式的,但可以转换成openssh格式的。PEM和OpenSSH之间的转换通过ssh-keygen -p来做。

对于公钥,OpenSSH,SSH2,PEM之间通过ssh-keygen -e或-i来转换。 ~/.ssh/authorized_keys中存放的公钥是OpenSSH格式。OCI中API Signing Key使用PKCS8格式的公钥

ssh-keygen -f /tmp/key.pub -e -m PKCS8
ssh-keygen -f a.pub -e -m a.pem

参考文献: