SSH真是个强大的工具,可以做到好多东西,最近学习了一点皮毛,总结下:
1.SSH目录
├── authorized_keys --服务器的已授权秘钥信息
├── config --本地配置
├── id_rsa --私钥
├── id_rsa.pub --公钥
└── known_hosts --已知认证的主机足迹
如果本机没有ssh目录的话,可以自己生成下:
ssh-keygen -t rsa -C "zhan@zhitao.com"
然后三个回车就可以了。
2.通过终端查看 SSH 远程登录是否已经开启
想要查看 Mac 上 SSH 的当前状态?使用简单的终端就可以检查 SSH 和远程登录目前是否已经开启:
sudo systemsetup -getremotelogin
如果已经开启的话,指令会显示 “Remote Login: On” ,反之就会显示“Remote Login: Off”。
通过终端指令开启Mac的SSH
要快速开启 SSH 服务器并允许 SSH 连接进入当前 Mac,使用下列指令:
sudo systemsetup -setremotelogin on
输入指令后并没有任何确认信息表明远程登录和 SSH 已经开启,但你可以使用上文提到的方法来检查是否开启成功。
通过终端指令关闭Mac的SSH
如果你想通过终端指令禁用 SSH 服务器并阻止远程连接,输入下列指令:
sudo systemsetup -setremotelogin off
3.配置本地ssh免密登录服务器
使用ssh 可以做到在本地免密登录服务器,很方便,可以参考这篇文章
这个命令要熟悉,拷贝本地的公钥到服务器
ssh-copy-id user@ip_address
另外本地也可以用别名代替用户和ip地址,具体的配置可以在 ~/.ssh/config中去配置,我这里配置了hw 和 ali 的。
因此在我本地使用 就可以登录了
ssh hw
或者
ssh ali
具体配置:
Host hw
hostname 你的ip
user 用户名
port 22
IdentityFile ~/.ssh/id_rsa
4.SSH实现外网访问内网
这种方式的原理就是通过当前unix/linux客户端向服务器主动的建立一个SSL隧道,然后将服务器上的某个端口(这里我定义为8888)转发到当前客户端的22端口上,这样任何一台计算机包括服务器本身,都能使用服务器上开启的某个端口连接到当前的客户端上,我理解到的就是进行了端口转发,然后间接通过服务器来访问内网的机器。
1. 在本地机器输入以下命令 (建立隧道)
ssh -p 22 -NR 8888:127.0.0.1:22 root@ip
在ssh文档中 -NR 的定义:
- -N
不执行远程命令. 用于转发端口. (仅限协议第二版) - -R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport - -g
允许远端主机连接本地转发的端口. - -f
要求 在执行命令前退至后台. 它用于当 准备询问口令或密语, 但是用户希望它在后台进行. 该选项隐含了 -n 选项. 在远端机器上启动 X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令. - -q
安静模式. 消除所有的警告和诊断信息 - -n:
把 stdin 重定向到 /dev/null (实际上防止从 stdin 读取数据). 在后台运行时一定会用到这个选项. 它的常用技巧是远程运行 X11 程序. 例如, ssh -n shadows.cs.hut.fi emacs 将会在 shadows.cs.hut.fi 上启动 emacs, 同时自动在加密通道中转发 X11 连接. 在后台运行. (但是如果 要求口令或密语, 这种方式就无法工作; 参见 -f 选项.)
2. 然后可以登录自己的服务器,在自己的服务器上就可以通过以下命令:
ssh 用户名@127.0.0.1 -8888
这里的用户名是你本地机器的用户名。
3. 如果是其他机器的话,就可以通过
ssh 用户名@ip -8888
这里的用户名是服务器上的用户名,ip是服务器的ip。
通过以上三个步骤就可以实现外网访问公司内网拉,不过要内网的机器一直开着,转发着端口。另外本地机器的ssh如果在一定时间内会停掉自动转发的请求,这个时候我们就需要安装autossh,来监控ssh转发请求,一直保持着这个请求。
5.SCP传输文件
在Linunx下使用SCP传输文件,也写在这里吧,反正工作或者以后学习会经常用到,把自己的文件传到服务器或者从服务器中拉文件下来。
先制定下规则:
fileLocal:本地文件位置
fileRemote:服务器文件位置
remoteIp:服务器ip
- 上传到远端服务器
scp fileLocal root@remoteIp:fileRemote
- 从服务器上复制文件到本地
scp root@remoteIp:fileRemote fileLocal
另外如果设定了别名的话,就是跟ssh那里一样,可以使用别名代替root@remoteIp
上面都是针对单个文件的,如果需要传输整个文件夹的话,需要用scp -r
另外使用scp要注意所使用的用户是否具有可读取远程服务器相应文件的权限,如果没有权限,需要chmod 777 一下。