windows · 2021年 1月 15日

ssh免密登录

ssh免密登录

server(服务器)配置

sudo apt-get install openssh-server
sudo /etc/init.d/ssh start

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

拷贝client的id_rsa.pub到server:

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 NameIP: 111.28.189.51
Host NamePort: 22
Host NameSaved sessions: c206
WindowApperance: Font 16-point
ConnectionDatalogin username: liup
ConnectionSSHX11X11 forwarding: enable

不间断连接

方案一

服务器主动保持连接

编辑 /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文件可以包含任何东西: 具有公共密钥的证书,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

    参考文献:

TOC