SSH
概要
ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd]
[-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
描述
ssh(SSH 客户端)是一个用于登录远程机器并在远程机器上执行命令的程序。它旨在在不可信任的主机之间提供安全加密通信,即使在不安全的网络上也可以进行通信。X11 连接、任意 TCP 端口和 UNIX 域套接字也可以通过安全通道转发。
- 简单示例
$ ssh root@139.196.28.125
ssh 连接并登录到指定的主机(可选用户名)。用户必须使用下面的几种方法之一向远程机器证明自己的身份(见下文)。如果指定了命令,则该命令将在远程主机上执行,而不是登录 shell。
如果指定了命令,则该命令将在远程主机上执行,而不是登录 shell。 选项如下:
选项 | 描述 |
---|---|
-1 | 强制 ssh 仅尝试协议版本 1。 |
-2 | 强制 ssh 仅尝试协议版本 2。 |
-4 | 强制 ssh 仅使用 IPv4 地址。 |
-5 | 强制 ssh 仅使用 IPv6 地址。 |
SSH 免密登录
如果你想在 A 中无需密码登录 B,你可以像这样做:
1、在 A 中生成 SSH 密钥
ssh-keygen -t rsa
可能会提示三次输入,直接按回车即可。它将在 .ssh 目录下生成 id_rsa
和 id_rsa.pub
。
2、将 A 的 id_rsa.pub
导入到 B 中
ssh-copy .ssh/id_rsa.pub root@139.196.28.125
如果 A 没有安装 ssh-copy
,我们可以这样做:
- 将
id_rsa.pub
复制到 B 中
houbinbindeMacBook-Pro:.ssh houbinbin$ scp ~/.ssh/id_rsa.pub root@139.196.28.125:id_rsa.pub
root@139.196.28.125's password:
id_rsa.pub
- 将其导入到 B 的
.ssh/authorized_keys
中
cat id_rsa.pub > .ssh/authorized_keys
如果你登录的用户没有 .ssh 目录,创建一个:
root@iZuf60ahcky4k4nfv470juZ:~# pwd
/root
root@iZuf60ahcky4k4nfv470juZ:~# mkdir .ssh
3、登录测试
houbinbindeMacBook-Pro:~ houbinbin$ ./ali.sh
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-86-generic x86_64)
* Documentation: https://help.ubuntu.com/
New release '16.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Welcome to aliyun Elastic Compute Service!
root@iZuf60ahcky4k4nfv470juZ:~#
SSH 内网穿透技术
假设已有:
- 一台公网主机(B)
- 可以联公网的主机的主机A、C
问: 如何让C访问A呢?
思路
1、C可以直接访问B,A可以访问B,所以要通过B作为二者沟通的桥梁。 2、当我们使用C访问B时,如何让B把消息传递给A呢?(SSH)
实现
- A来征服
ssh -N -f -R 2323:127.0.0.1:22 139.196.28.125
作用:告诉139.196.28.125(B), 如果有人请求你的2323端口, 你就把这个请求转到我(A)的22号端口
-N: 告诉B, 我这个命令你什么也不要做, 只需要做转发就行了 -f:让这条命令在A的后台执行(不会因为关掉命令窗口而断开链接) -R: 格式-R X:Y:Z, 作用是做端口映射, 把远程机器的端口X映射(转发)到本地机器Y的Z端口
- C来见证
1、C访问B
ssh root@139.196.28.125
2、访问指定端口
让B访问自己的2323端口,等于直接访问A的22端口(22为默认ssh端口)
ssh -p 2323 root@localhost
将内网服务器设置为外网可以访问
指定转发脚本: conn.sh
# kill ssh
echo "kill all ssh..."
ps -ef | grep ssh | grep -v sshd | cut -c 9-15 | xargs kill -9
# ssh
ssh -C -f -N -g -L 8080:42.196.156.22:18080 -p 12222 houbinbin@42.196.156.22
ssh -C -f -N -g -L 8081:42.196.156.22:18081 -p 12222 houbinbin@42.196.156.22
ssh -C -f -N -g -L 9000:42.196.156.22:19000 -p 12222 houbinbin@42.196.156.22
ssh -C -f -N -g -L 80:42.196.156.22:10080 -p 12222 houbinbin@42.196.156.22
定时执行:
# crontab -e
添加内容如下:
# 每小时进行一次转发重连
0 */1 * * * /root/shell/conn.sh
SSH 访问其他服务器卡顿
ssh 访问很慢的原因和解决办法
原因:访问服务器的时候会把服务器的 ip 地址反向解析为域名,如果无法解析就会导致登陆时很慢
下面三种方法都可以解决这个问题
1、清空/etc/resolv.conf文件中nameserver记录
2、在客户机的/etc/hosts文件中添加服务器域名的解析记录
3、修改客户机的 /etc/ssh/ssh_config
文件中:
GSSAPIAuthentication no
我使用的方法 3,调整后重启机器。感觉好了很多。
拓展阅读
更多学习
更多实时资讯,前沿技术,生活趣事。尽在【老马啸西风】
交流社群:[交流群信息](https://mp.weixin.qq.com/s/rkSvXxiiLGjl3S-ZOZCr0Q)