SSH学习

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 一下。


   转载规则


《SSH学习》 ForeverSen 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
2019.12月总结 2019.12月总结
12月最后一个月,明天就是2020年了,回顾2019,感觉成长了许多,2020,希望能继续保持对技术的热情,做自己喜欢做的事,明年,也将毕业啦,从此便是社会人。🏷️ 1. JRebel实现热部署减少重启时间平时我们在开发中总是需要不断修改
2020-01-05
下一篇 
2019.11月总结 2019.11月总结
十一月,很快,已经实习一个多月了,感觉最近写的业务还是挺多的,也学习到了许多东西,平时自己遇到了困难也会在这里总结下,不过这个月偷懒了一把,没利用空余的时间去学习新的技术,不过最近开始看书了😂。 1. Spring中@RequestPar
2019-12-01
  目录