Linux ssh
约 1172 字大约 4 分钟
2025-01-11
介绍
ssh
命令用于通过 SSH
协议连接到远程主机,实现远程登录和执行命令,它加密会话中的所有通信,确保数据传输的安全性。 SSH (Secure Shell)
是一种用于远程登录和其他网络服务之间的加密协议,SSH
提供了一个安全的通信渠道,以保护数据的机密性和完整性。
语法
$ ssh [options] [user@]hostname [command]
参数说明
[user@]hostname
:要连接的远程主机的用户名和主机名。[command]
:可选的在远程主机上执行的命令。
常用选项:
-l user
:指定要登录的用户。-p port
:指定连接到远程主机的端口号,默认是22
。-i identity_file
:指定身份验证文件(私钥文件)。-v
:详细模式,可以显示调试信息。-C
:启用压缩。-N
:不执行远程命令,只进行端口转发。-f
:后台运行。-L local_port:remote_host:remote_port
:本地端口转发。-R remote_port:local_host:local_port
:远程端口转发。-D [bind_address:]port
:动态应用程序级端口转发。
使用
基本用法
连接到远程主机
$ ssh user@hostname
指定端口连接
$ ssh -p 2222 user@hostname
使用身份验证文件:
$ ssh -i /path/to/private_key user@hostname
在远程主机上执行命令
$ ssh user@hostname command
详细模式
$ ssh -v user@hostname
启用压缩
$ ssh -C user@hostname
后台运行且不执行命令
$ ssh -f -N user@hostname
端口转发
- 本地端口转发:
$ ssh -L local_port:remote_host:remote_port user@hostname
- 远程端口转发:
$ ssh -R remote_port:local_host:local_port user@hostname
- 动态端口转发:
$ ssh -D [bind_address:]port user@hostname
高级用法
配置文件
SSH
客户端配置文件位于 ~/.ssh/config
,可以在其中设置常用配置。
示例:
Host example
HostName example.com
User root
Port 22
IdentityFile ~/.ssh/id_rsa
使用时只需:
$ ssh example
SSH
代理转发
- 启用代理转发:
$ ssh -A user@hostname
X11
转发
启用 X11
转发:
$ ssh -X user@hostname
SSH
工具
PuTTY
PuTTY
是Windows
上经典的免费SSH
连接工具,通常用于使用SSH
协议远程登录设备,最新版本可以在PuTTY
官网下载。
OpenSSH
OpenSSH
是SSH
协议的开源实现,支持在Unix
操作系统上运行,最新版本可以在OpenSSH
官网下载。目前Windows10
已经包含OpenSSH
客户端和服务器软件,可在“设置—应用—应用与功能—可选功能”中搜索安装。
应用
免密登录
使用SSH
远程连接,每次都需要输入密码,比较麻烦,可以通过SSH
配置实现免密登录。在远程主机的操作,主要是添加公钥。在本地主要是修改SSH
配置文件。具体可参考SSH 免密登录
ssh
远程无法获取被远程机器的环境变量
在ssh
远程无法获取被远程机器的环境变量的。可以使用如下方式:
第一种
$ ssh user@ip <<EOF
nohup java -jar .... &
EOF
第二种,在脚本一开始加上source /etc/profile
,刷新就可以获取到环境变量了。
source /etc/profile
示例:nohup
命令在shell
脚本无法执行
我们希望在脚本中使用nohup
来启动一个进程,但是发现nohup
命令无法执行,提示找不到环境变量。
!#/bin/bash
nohup echo "hello world"
在脚本中加上 source /etc/profile
就好了
!#/bin/bash
source /etc/profile
nohup echo "hello world"
这是因为找不到环境变量,所以先source
一下就行了。
注意 在ssh
远程的时候执行nohup
命令,也是无法获取被远程机器的环境变量的。也需要添加source /etc/profile
SSH
端口转发
SSH
存在的问题
如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https
协议,SSH
协议的公钥是没有证书中心(CA
)公证的,也就是说,都是自己签发的。所有在首次链接的时候需要用户确认一下。
可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi
区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH
的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)
。