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 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
不间断连接
方案一
服务器主动保持连接
编辑 /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登录
- 修改 root 密码:执行命令sudo passwd root
- 输入密码:可以和 ubuntu 密码一致,也可以修改 (密码会让你输入两次)
- 修改 ssh 配置:执行命令
sudo vim /etc/ssh/sshd_config
- 修改 PermitRootLogin:进入 ssh 配置界面后找到
PermitRootLogin
,将它后面改为yes
/No
,保存 (按i进入编辑模式,编 辑完esc退出,:w保存当前文件,:q退出) - 重启 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
配置端口映射:
- 查询入口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
常见问题
每次ssh连接后都需要source
在.bash_profile文件中自动加载.bashrc文件。修改~/.bashrc后终端登录不能自动加载问题 here
vim ~/.bash_profile在文件内部输入
# 加载.bashrc文件
if [ -s ~/.bashrc ]; then
source ~/.bashrc
fi
参考文献:nsnvainva
openssh密匙转ppk
目前有两个主流的密钥格式:OpenSSH格式的密钥 和 PuTTY格式的密钥。
id_rsa
和id_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
参考文献: