第四章、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
HostNameUser这关键字不区分大小写 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最好放在 sourcedestination 前面
source 和 destination 可以都是服务器,但是涉及服务器之间的配置问题,可以通过将本机作为跳板实现服务器之间的文件传输操作 server1 -> 本机 -> server2

实例:
将 homework 文件传输到服务器中,服务器再传输到本机上

# 本机 -> 服务器
scp -r homework/ xyg_server1:
mv homework/ ./homework2

# 服务器 -> 本机
scp -r -P 22 xyg_server1:homework ./homework

3.注意事项

可以使用 treeag 的使用

通过书写 .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}\""
posted @ 2022-07-17 17:09  lucky_light  阅读(193)  评论(0编辑  收藏  举报