[3] 操作系统 · 2021年1月13日 0

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文件中:

chmod 600 .ssh
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程序的功能, 假定现在有

  客服端 C :192.168.0.13

  服务器 S :192.168.0.200

首先确保在客服端C 上能够通过 ssh tsfh@192.168.0.200 连接到服务器S, 如果需要使用远程的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

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

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

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

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

ssh空闲超时不间断断开的问题

编辑/etc/ssh/sshd_config 文件

ClientAliveInterval 60
ClientAliveCountMax 3

这两项默认是注释的, 您可以使用vi 或者vim编辑器去掉注释,然后重启sshd 服务:

systemctl restart sshd

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"

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

同步文件到远程主机(ssh,tar)

# (压缩到远程) 在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

开启ssh root登录

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

路由器端口映射局域网ssh

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

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

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

具体方法

进行IP与MAC绑定: 防止IP变动:

配置端口映射:

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

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

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

ssh登录命令:

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