ssh命令
一.SSH概念
Linux中的Secure Shell即SSH主要的作用是通过加密的网络协议,安全地远程登入和执行命令。
具体的作用:
1.安全的远程管理
替代不安全的Telnet(早期互联网中使用的一种远程登入协议,核心功能与SSH一致,都是让用户从本地计算机连接并操作远程主机,但Telnet最大的问题是所有的数据透明,不加密)。
典型场景:管理员在家通过SSH连接的公司机房的Linux服务器,进行维护、查看日志、配置软件等
2.安全的文件传输
基于SSH协议,可以安全地复制文件,内置命令有:
- scp(Secure Copy):像cp命令一样在本地/远程间复制文件
- sftp(SSH File Transfer Protocol):类似FTP,但全程加密,是更加安全交互式文件管理方式
典型场景:将网站代码从开发机上传到部署服务器,或从服务器下载数据库备份
3.端口转发(加密隧道)
4.安全的身份验证方式
- 常规方式:密码登入
- 公钥登入:生成密钥对,登入时无需输入密码,且无法通过暴力破解密码
二.SSH命令
SSH工具集主要包括三个最常用的命令:ssh(远程登入)、scp(复制文件)、sftp(传输文件)。另外还会涉及生成密钥的ssh-keygen。
1.ssh远程登入
基本语法:
ssh [选项] 用户名@主机地址
常用示例:
| 命令 | 说明 |
|---|---|
ssh root@192.168.1.100 |
使用 root 用户登录 IP 为 192.168.1.100 的服务器 |
ssh user@example.com -p 2222 |
指定端口 2222 登录(默认端口是 22) |
ssh user@server "ls -la" |
登录后直接执行一条命令,然后退出(不进入交互式 shell) |
ssh -v user@server |
显示详细的连接调试信息(用于排错) |
Hadoop中遇到的例子:
[root@master ~]# for host in master slave1 slave2; do
> echo "--------------- $host -------------------"
> ssh $host jps
> done
----------------- master ------------------
3364 ResourceManager
3764 JobHistoryServer
3114 SecondaryNameNode
5642 Jps
2845 NameNode
----------------- slave1 ------------------
2792 NodeManager
2681 DataNode
4653 Jps
----------------- slave2 ------------------
4643 Jps
2694 DataNode
2806 NodeManager
上面这个脚本是一个for循环,用于在三台机器(master、slave1、slave2)上分别执行jps命令
| 行 | 代码 | 含义 |
|---|---|---|
| 1 | for host in master slave1 slave2; do |
定义一个循环变量 host,它会依次取值为 master、slave1、slave2 |
| 2 | echo "================ $host =================" |
打印分隔线,显示当前正在检查哪台机器 |
| 3 | ssh $host jps |
通过 SSH 登录到 $host 这台机器,并执行 jps 命令 |
| 4 | done |
循环结束 |
注意事项:
- 这个脚本能执行的前提是master机器已经配置好到slave1、slave2的SSH免密登入(使用公钥认证),否则每次连接都会要求输入密码
- 如果jps不在系统PATH中,则需要写出完整路径
[root@master ~]# $JAVA_HOME
-bash: /usr/java/jdk1.8.0_281-amd64: Is a directory
[root@master ~]# echo $JAVA_HOME
/usr/java/jdk1.8.0_281-amd64
[root@master ~]# which jps
/usr/bin/jps
上述脚本也可以写成一行:
for host in master slave1 slave2; do echo "===== $host ====="; ssh $host jps; done
其实,脚本的ssh命令完整且标准的写法是:
ssh root@$host jps
而
ssh $host jps
是简化写法,省略了用户名@,此时SSH会自动使用你当前所在的本地用户名作为远程登入的用户名
2.scp安全复制文件
基本语法:
# 本地 → 远程
scp [选项] 本地文件 用户名@主机:远程路径
# 远程 → 本地
scp [选项] 用户名@主机:远程文件 本地路径
先在slave1中看一下根目录的结构:
[root@slave1 ~]# cd /
[root@slave1 /]# ls
bin boot data demo01 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
查看一下master根目录下的一个文件:
[root@master ~]# cd /
[root@master /]# ls
bin boot data demo01 dev etc home lib lib64 media mnt opt parent proc Projects root run sbin srv sys Tests tmp usr var
[root@master /]# cd Tests
[root@master Tests]# ls
myfile1.txt S Sub
[root@master Tests]# cat myfile1.txt
01点26分
把myfile1.txt文件复制到slave1的根目录下:
[root@master Tests]# scp myfile1.txt root@slave1:/
myfile1.txt
这里需要注意:slave1后的冒号后要紧跟目标地址,不能有空格!
[root@slave1 /]# ls
bin boot data demo01 dev etc home lib lib64 media mnt myfile1.txt opt proc root run sbin srv sys tmp usr var
[root@slave1 /]# cat myfile1.txt
01点26分
使用选项-r递归复制整个文件夹:
[root@slave1 /]# mkdir DIR
[root@slave1 /]# echo "HELLO TODAY 2026年5月4日" > /DIR/file.txt
[root@slave1 /]# ls
bin boot data demo01 dev DIR etc home lib lib64 media mnt myfile1.txt opt proc root run sbin srv sys tmp usr var
[root@slave1 /]# cd DIR
[root@slave1 DIR]# ls
file.txt
[root@slave1 DIR]# cat file.txt
HELLO TODAY 2026年5月4日
[root@master Tests]# scp -r root@slave1:/DIR /root/ # 将DIR目录递归复制到root用户的家目录,注意区别:/是根目录
file.txt
[root@master Tests]# cd /
[root@master /]# cd # 切换到当前用户(即root用户)的家目录,cd ~命令也是同样的效果
[root@master ~]# cd
[root@master ~]# ls
anaconda-ks.cfg data1.txt data3.txt DIR file1.txt hadoop-3.1.4.tar.gz test.txt
[root@master ~]# cd DIR
[root@master DIR]# ls
file.txt
[root@master DIR]# cat file.txt
HELLO TODAY 2026年5月4日
3.sftp交互式文件传输
基本用法:
sftp 用户名@主机地址
进入后是一个 sftp> 提示符,支持类似 FTP 的命令
[root@master DIR]# sftp root@slave1
Connected to slave1.
sftp> pwd
Remote working directory: /root
sftp> ls
anaconda-ks.cfg
sftp> cd /
sftp> ls
DIR bin boot data demo01 dev etc home lib lib64 media mnt myfile1.txt opt
proc root run sbin srv sys tmp usr var
sftp> cd DIR/
sftp> ls
file.txt
sftp> cat file.txt
Invalid command.
sftp> !cat file.txt
HELLO TODAY 2026年5月4日
sftp> exit
cat不是sftp的内置命令。sftp只支持文件传输的基本文件管理操作,不支持查看文件内容这类需要“读取并显示”的操作。
因为sftp的设计目标是“文件传输协议”,而不是远程命令执行
可以在sftp中使用!cat命令查看文件内容
!前缀可以执行本地系统命令,不通过远程。
cat 的原理可以概括为:在本地 Shell 中执行命令,而不是通过 SFTP 协议发送到远程服务器。
核心原理
sftp 客户端程序在运行时,会持续监听你的输入。当它检测到一行以 ! 开头的命令时,会做以下事情:
-
识别特殊前缀:识别出
!不是标准的 SFTP 协议命令。 -
提取命令:将
!之后的部分(例如cat /tmp/file.txt)提取出来。 -
调用本地 Shell:在你的本地机器上,启动一个新的 Shell 进程(比如
sh或bash)。 -
执行命令:将提取出的命令字符串传递给这个本地 Shell 去执行。
-
显示结果:将本地 Shell 执行命令的标准输出(stdout)和标准错误(stderr)直接显示在你的
sftp终端界面上。 -
返回 SFTP:命令执行完毕后,关闭临时的 Shell 进程,回到
sftp>提示符,等待你的下一个 SFTP 命令。
如果本地 master 没有 file.txt 这个文件,!cat file.txt 一定会执行失败。
[root@master DIR]# cd /
[root@master /]# sftp root@slave1
Connected to slave1.
sftp> ls
anaconda-ks.cfg
sftp> cd /
sftp> ls
DIR bin boot data demo01 dev etc home lib lib64 media mnt myfile1.txt opt
proc root run sbin srv sys tmp usr var
sftp> cd DIR
sftp> ls
file.txt
sftp> cat file.txt
Invalid command.
sftp> !cat file.txt
cat: file.txt: No such file or directory
Shell exited with status 1
sftp>
我第一次是在本地的DIR目录下执行sftp命令来操作slave1虚拟机的,当在sftp程序中输入!cat后会在本地的当前目录执行cat file.txt,而file.txt文件就在DIR目录下,所以执行成功
现在我切换了目录,本地的当前目录不是DIR了,所以再次在sftp上执行就会报错!
sftp 支持的命令列表
| 命令 | 功能 | 示例 |
|---|---|---|
ls |
列出目录内容 | ls -la |
cd |
切换远程目录 | cd /DIR |
pwd |
显示远程当前目录 | pwd |
get |
下载文件 | get file.txt |
put |
上传文件 | put local.txt |
rm |
删除远程文件 | rm file.txt |
rmdir |
删除远程空目录 | rmdir emptyDir |
mkdir |
创建远程目录 | mkdir newDir |
mv |
重命名/移动远程文件 | mv old.txt new.txt |
lls |
列出本地目录内容 | lls |
lcd |
切换本地目录 | lcd /tmp |
lpwd |
显示本地当前目录 | lpwd |
! |
执行本地 shell 命令 | !cat /etc/hostname |
exit 或 bye |
退出 sftp | exit |
4.ssh和sftp的区别
ssh命令除了建立加密通道进行安全的远程登入外(核心功能),还可以远程执行命令(无交互式登入)
而sftp是ssh的一个专门用于“文件传输”的“子功能”
| 特性 | ssh |
sftp |
|---|---|---|
| 全称 | Secure SHell | SSH File Transfer Protocol |
| 主要用途 | 远程命令执行和系统交互管理 | 安全文件传输和远程文件管理 |
| 工作模式 | 登录到远程 Shell 执行命令 | 进入一个专门的 sftp> 提示符环境 |
| 支持命令 | 几乎所有 Linux 命令 (ls, cd, cat, grep 等) |
有限的文件操作命令 (ls, cd, get, put, rm) |
| 交互方式 | 交互式 Shell (如 bash) | 专用文件传输接口 (类似 FTP) |
| 能否执行系统命令 | 能 | 不能 (只能执行 sftp 内置命令) |
| 共同点 | 都是基于 SSH 协议,数据传输都是安全的 | 都是基于 SSH 协议,数据传输都是安全的 |
| 类比 | 瑞士军刀 (功能全面,什么都能做) | 一把高级螺丝刀 (只做一件事,但做得很好 |
-
ssh是基础协议和主命令,用于安全登录和执行一切操作。它的“端口转发”功能更是无可替代。 -
sftp是ssh的一个子协议和配套工具,专门用于在安全通道下进行文件管理(上传、下载、删除、重命名等)。它比scp更强大、更灵活(支持断点续传、目录列表等)。 -
日常使用:执行系统命令、配置服务用
ssh;传输单个文件用scp;需要交互式浏览和管理远程文件用sftp。
ssh完全支持的命令:
| 命令 | 通过 SSH 执行 | 示例 |
|---|---|---|
ls |
✅ 完全支持 | ssh root@slave1 "ls -la /DIR" |
mkdir |
✅ 完全支持 | ssh root@slave1 "mkdir /DIR/newfolder" |
rm |
✅ 完全支持 | ssh root@slave1 "rm /DIR/file.txt" |
rmdir |
✅ 完全支持 | ssh root@slave1 "rmdir /DIR/emptyfolder" |
cp |
✅ 完全支持 | ssh root@slave1 "cp /DIR/file.txt /tmp/" |
mv |
✅ 完全支持 | ssh root@slave1 "mv /DIR/old.txt /DIR/new.txt" |
touch |
✅ 完全支持 | ssh root@slave1 "touch /DIR/newfile.txt" |
cat |
✅ 完全支持 | ssh root@slave1 "cat /DIR/file.txt" |
有特殊限制的命令:
| 命令 | 限制说明 | 解决方案 |
|---|---|---|
cd |
无法改变远程 Shell 的当前目录(因为每次 ssh 都是独立的非交互式会话) |
使用 && 连接命令,或使用 cd 后跟要执行的命令 |
| 你想做什么 | 推荐做法 |
|---|---|
| 查看远程目录 | ssh host "ls -la /path" |
| 进入远程目录后执行多个操作 | ssh host "cd /path && cmd1 && cmd2" |
| 在远程创建目录 | ssh host "mkdir -p /path/dir" |
| 在远程复制/移动文件 | ssh host "cp /src /dst" |
| 在远程删除文件 | ssh host "rm /path/file" |
需要交互式操作(多次 cd) |
直接 ssh host 登录进去操作 |
如:在slave1中需要多次cd,不如直接ssh host登入到slave1中去cd
[root@master /]# ssh root@slave1
Last login: Mon May 4 09:16:08 2026 from 192.168.128.1
[root@slave1 ~]#
例子:
[root@master ~]# ssh root@slave1
root@slave1's password: # 输入密码(如果没配免密)
Last login: Mon May 4 10:30:15 2026 from master
[root@slave1 ~]# # 注意:提示符变了,说明已经在 slave1 上
现在你已经在 slave1 上了,可以连续执行多个 cd,目录状态会保持
[root@slave1 ~]# pwd
/root
[root@slave1 ~]# cd /
[root@slave1 /]# pwd
/
[root@slave1 /]# cd DIR
[root@slave1 DIR]# pwd
/DIR
[root@slave1 DIR]# ls
file.txt
[root@slave1 DIR]# cd ..
[root@slave1 /]# pwd
/
[root@slave1 /]# exit # 退出登录
logout
Connection to slave1 closed.
[root@master ~]# # 回到 master
关键点
| 操作 | 说明 |
|---|---|
ssh root@slave1 |
登录到 slave1 |
执行任意命令(包括多次 cd) |
目录状态会一直保持 |
exit 或 Ctrl+D |
退出登录,回到 master |
与 ssh host "command" 的区别
| 方式 | 特点 | 适用场景 |
|---|---|---|
ssh host "command" |
执行单条命令后自动退出 | 快速执行一条命令 |
ssh host |
登录进去,可以执行多条命令,状态保持 | 需要连续操作、多次 cd、调试排查 |
退出的方法
-
输入
exit回车 -
按
Ctrl + D
注:在Linux中使用ssh执行远程命令时,简单命令(无特殊字符、无变量、无空格参数)时可以不用引号包裹起来。但当命令包含空格、重定向、管道、分号、$变量等特殊字符时强烈建议使用双引号或单引号包裹,防止本地shell提前解释。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)