一.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,它会依次取值为 masterslave1slave2
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 客户端程序在运行时,会持续监听你的输入。当它检测到一行以 ! 开头的命令时,会做以下事情:

  1. 识别特殊前缀:识别出 ! 不是标准的 SFTP 协议命令。

  2. 提取命令:将 ! 之后的部分(例如 cat /tmp/file.txt)提取出来。

  3. 调用本地 Shell:在你的本地机器上,启动一个新的 Shell 进程(比如 sh 或 bash)。

  4. 执行命令:将提取出的命令字符串传递给这个本地 Shell 去执行。

  5. 显示结果:将本地 Shell 执行命令的标准输出(stdout)标准错误(stderr)直接显示在你的 sftp 终端界面上。

  6. 返回 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 命令 (lscdcatgrep 等) 有限的文件操作命令 (lscdgetputrm)
交互方式 交互式 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提前解释。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐