第四章、ssh登录和scp传输文件
正文
第四章、ssh登录和scp传输文件
1. ssh 登录
ssh
是用于本地登录远程服务器的指令(支持套娃)
1.1 基础用法
:<<EOF 基础用法: user_name 表示用户名 host_name 表示服务器 IP 或者是 域名 EOF ssh user_name@host_name
:<<EOF -p 指定端口号码,默认端口号为22 EOF ssh -p port_num user_name@host_name ssh user_name@host_name -p port_num
第一次登录时会提示:
The authenticity of host '123.57.47.211 (123.57.47.211)' can't be established. ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8. Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入yes
,然后回车即可。
这样会将该服务器的信息记录在~/.ssh/known_hosts
文件中。
然后输入密码即可登录到远程服务器中。
输入logout
或者exit
或者ctrl + d
即可退出服务器。
1.2 配置别名
因输入user_name 和 host_name过于繁琐,可以配置 ssh 文件 ~/.ssh/config
HostName
和User
这关键字不区分大小写 hostname
user
也是一样效果。
Host alias1: HostName Ip地址或者域名 User 用户名 Host alias2: HostName Ip地址或者域名 User 用户名
配置后,可以通过 alias
别名 ssh
到服务器中。
1.3 免密登录
通过在本机生成公钥私钥,并将公钥传入到服务器中,实现免密登录服务器
手动式现
# 首先在本机生成密钥 ssh-keygen
执行结束后,~/.ssh/
目录(这是默认的生成文件目录,也是可以修改的)下会多两个文件:id_rsa
(私钥),id_rsa.pub
(公钥)
生成的公钥传输到服务器指定位置~/.ssh/authorized_keys
自己复制,然后ssh
进入服务器,创建文件粘贴
也可以使用如下命令一键添加公钥:
ssh-copy-id myserver
当我们主机 再次生成新的密钥文件时,需要重新执行免密登录公钥传输的操作。
1.4 ssh 服务器端执行命令
服务器上集成跑代码
ssh user@hostname command
示例:
单引号使得 $i
不会在本地被解析,完整传输到服务器中。
ssh xyg_server1 'for((i=1;i<=10;i++)); do echo $i; done'
双引号中的 $i
在传输到服务器前会被解析为本机变量,进而被替换掉。
ssh xyg_server1 "for((i=1;i<=10;i++)); do echo $i; done"
2. scp 传输文件
2.1 基础用法
文件复制
scp source destination scp source1 source2 ... destination
文件夹复制
scp -r source destination
指定服务器端口
scp -P port_num source destination
注意事项:
scp
命令参数-P
和-r
最好放在 source
和 destination
前面
source 和 destination 可以都是服务器,但是涉及服务器之间的配置问题,可以通过将本机作为跳板实现服务器之间的文件传输操作 server1 -> 本机 -> server2
实例:
将 homework 文件传输到服务器中,服务器再传输到本机上
# 本机 -> 服务器 scp -r homework/ xyg_server1: mv homework/ ./homework2 # 服务器 -> 本机 scp -r -P 22 xyg_server1:homework ./homework
3.注意事项
可以使用 tree
和 ag
的使用
通过书写 .sh
脚本操纵服务器时候,利用ssh
,
错误做法1:问题在于 ssh 命令之后,直接跳到服务器命令行上,后面的操作并不会执行,直到你手动退出服务器后,后面的操作才会执行。
#! /bin/bash ssh myserver 操作1 操作2 logout
因此,需要使用 ssh myserver command
但是也是有坑点的
错误做法2: 因为 ${dir_name} 是传递的参数,可能存在空格,因此我们需要对 dir_name 单独加转义后的双引号,目的是让其在服务器上也存在双引号。
#! /bin/bash dir_name="$1" base_name='~/homework/lesson_4/homework_4' ssh myserver "mkdir ${base_name}/${dir_name}"
正确做法
#! /bin/bash dir_name="$1" base_name='~/homework/lesson_4/homework_4' ssh myserver "mkdir ${base_name}/\"${dir_name}\""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)