一.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命令

代码含义
1for host in master slave1 slave2; do定义一个循环变量 host,它会依次取值为 masterslave1slave2
2echo "================ $host ================="打印分隔线,显示当前正在检查哪台机器
3ssh $host jps通过 SSH 登录到 $host 这台机器,并执行 jps 命令
4done循环结束

注意事项:

  • 这个脚本能执行的前提是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退出 sftpexit

4.ssh和sftp的区别

ssh命令除了建立加密通道进行安全的远程登入外(核心功能),还可以远程执行命令(无交互式登入)

而sftp是ssh的一个专门用于“文件传输”的“子功能”

特性sshsftp
全称Secure SHellSSH 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 等多样性计算架构

更多推荐