ssh命令
一.SSH概念Linux中的Secure Shell即SSH主要的作用是通过加密的网络协议安全地远程登入和执行命令。具体的作用1.安全的远程管理替代不安全的Telnet早期互联网中使用的一种远程登入协议核心功能与SSH一致都是让用户从本地计算机连接并操作远程主机但Telnet最大的问题是所有的数据透明不加密。典型场景管理员在家通过SSH连接的公司机房的Linux服务器进行维护、查看日志、配置软件等2.安全的文件传输基于SSH协议可以安全地复制文件内置命令有scpSecure Copy像cp命令一样在本地/远程间复制文件sftpSSH File Transfer Protocol类似FTP但全程加密是更加安全交互式文件管理方式典型场景将网站代码从开发机上传到部署服务器或从服务器下载数据库备份3.端口转发加密隧道4.安全的身份验证方式常规方式密码登入公钥登入生成密钥对登入时无需输入密码且无法通过暴力破解密码二.SSH命令SSH工具集主要包括三个最常用的命令ssh远程登入、scp复制文件、sftp传输文件。另外还会涉及生成密钥的ssh-keygen。1.ssh远程登入基本语法ssh [选项] 用户名主机地址常用示例命令说明ssh root192.168.1.100使用 root 用户登录 IP 为 192.168.1.100 的服务器ssh userexample.com -p 2222指定端口 2222 登录默认端口是 22ssh userserver ls -la登录后直接执行一条命令然后退出不进入交互式 shellssh -v userserver显示详细的连接调试信息用于排错Hadoop中遇到的例子[rootmaster ~]# 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它会依次取值为master、slave1、slave22echo $host 打印分隔线显示当前正在检查哪台机器3ssh $host jps通过 SSH 登录到$host这台机器并执行jps命令4done循环结束注意事项这个脚本能执行的前提是master机器已经配置好到slave1、slave2的SSH免密登入使用公钥认证否则每次连接都会要求输入密码如果jps不在系统PATH中则需要写出完整路径[rootmaster ~]# $JAVA_HOME -bash: /usr/java/jdk1.8.0_281-amd64: Is a directory [rootmaster ~]# echo $JAVA_HOME /usr/java/jdk1.8.0_281-amd64 [rootmaster ~]# 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中看一下根目录的结构[rootslave1 ~]# cd / [rootslave1 /]# ls bin boot data demo01 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var查看一下master根目录下的一个文件[rootmaster ~]# cd / [rootmaster /]# 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 [rootmaster /]# cd Tests [rootmaster Tests]# ls myfile1.txt S Sub [rootmaster Tests]# cat myfile1.txt 01点26分把myfile1.txt文件复制到slave1的根目录下[rootmaster Tests]# scp myfile1.txt rootslave1:/ myfile1.txt这里需要注意slave1后的冒号后要紧跟目标地址不能有空格[rootslave1 /]# ls bin boot data demo01 dev etc home lib lib64 media mnt myfile1.txt opt proc root run sbin srv sys tmp usr var [rootslave1 /]# cat myfile1.txt 01点26分使用选项-r递归复制整个文件夹[rootslave1 /]# mkdir DIR [rootslave1 /]# echo HELLO TODAY 2026年5月4日 /DIR/file.txt [rootslave1 /]# 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 [rootslave1 /]# cd DIR [rootslave1 DIR]# ls file.txt [rootslave1 DIR]# cat file.txt HELLO TODAY 2026年5月4日[rootmaster Tests]# scp -r rootslave1:/DIR /root/ # 将DIR目录递归复制到root用户的家目录注意区别/是根目录 file.txt [rootmaster Tests]# cd / [rootmaster /]# cd # 切换到当前用户即root用户的家目录cd ~命令也是同样的效果 [rootmaster ~]# cd [rootmaster ~]# ls anaconda-ks.cfg data1.txt data3.txt DIR file1.txt hadoop-3.1.4.tar.gz test.txt [rootmaster ~]# cd DIR [rootmaster DIR]# ls file.txt [rootmaster DIR]# cat file.txt HELLO TODAY 2026年5月4日3.sftp交互式文件传输基本用法sftp 用户名主机地址进入后是一个sftp提示符支持类似 FTP 的命令[rootmaster DIR]# sftp rootslave1 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 exitcat不是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一定会执行失败。[rootmaster DIR]# cd / [rootmaster /]# sftp rootslave1 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 -lacd切换远程目录cd /DIRpwd显示远程当前目录pwdget下载文件get file.txtput上传文件put local.txtrm删除远程文件rm file.txtrmdir删除远程空目录rmdir emptyDirmkdir创建远程目录mkdir newDirmv重命名/移动远程文件mv old.txt new.txtlls列出本地目录内容llslcd切换本地目录lcd /tmplpwd显示本地当前目录lpwd!执行本地 shell 命令!cat /etc/hostnameexit或bye退出 sftpexit4.ssh和sftp的区别ssh命令除了建立加密通道进行安全的远程登入外核心功能还可以远程执行命令无交互式登入而sftp是ssh的一个专门用于“文件传输”的“子功能”特性sshsftp全称Secure SHellSSH 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 rootslave1 ls -la /DIRmkdir✅ 完全支持ssh rootslave1 mkdir /DIR/newfolderrm✅ 完全支持ssh rootslave1 rm /DIR/file.txtrmdir✅ 完全支持ssh rootslave1 rmdir /DIR/emptyfoldercp✅ 完全支持ssh rootslave1 cp /DIR/file.txt /tmp/mv✅ 完全支持ssh rootslave1 mv /DIR/old.txt /DIR/new.txttouch✅ 完全支持ssh rootslave1 touch /DIR/newfile.txtcat✅ 完全支持ssh rootslave1 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[rootmaster /]# ssh rootslave1 Last login: Mon May 4 09:16:08 2026 from 192.168.128.1 [rootslave1 ~]#例子[rootmaster ~]# ssh rootslave1 rootslave1s password: # 输入密码如果没配免密 Last login: Mon May 4 10:30:15 2026 from master [rootslave1 ~]# # 注意提示符变了说明已经在 slave1 上现在你已经在slave1上了可以连续执行多个cd目录状态会保持[rootslave1 ~]# pwd /root [rootslave1 ~]# cd / [rootslave1 /]# pwd / [rootslave1 /]# cd DIR [rootslave1 DIR]# pwd /DIR [rootslave1 DIR]# ls file.txt [rootslave1 DIR]# cd .. [rootslave1 /]# pwd / [rootslave1 /]# exit # 退出登录 logout Connection to slave1 closed. [rootmaster ~]# # 回到 master关键点操作说明ssh rootslave1登录到 slave1执行任意命令包括多次cd目录状态会一直保持exit或CtrlD退出登录回到 master与ssh host command的区别方式特点适用场景ssh host command执行单条命令后自动退出快速执行一条命令ssh host登录进去可以执行多条命令状态保持需要连续操作、多次 cd、调试排查退出的方法输入exit回车按Ctrl D