跳转至

SSH 常用指令

总览指令

在Linux中,SSH是一种常用的远程登录协议,可以实现安全的远程服务器登录和文件传输:

  1. ssh:通过SSH连接到远程主机。例如:ssh user@hostname

  2. ssh-keygen:生成SSH密钥对。使用这个命令可以生成公钥和私钥,用于身份验证。例如:ssh-keygen -t rsa

  3. ssh-copy-id:将SSH公钥拷贝到远程主机上,以免每次登录都需要输入密码。例如:ssh-copy-id user@hostname

  4. ssh-add:将私钥添加到SSH代理中,以便免密钥输入密码。例如:ssh-add ~/.ssh/id_rsa

  5. ssh-agent:启动SSH代理。SSH代理是一个将私钥保存在内存中的程序,用于管理SSH身份验证过程。例如:eval ssh-agent

  6. scp:通过SSH在本地主机和远程主机之间传输文件。例如:scp localfile user@hostname:remotefile

  7. sftp:通过SSH在本地主机和远程主机之间进行交互式文件传输。sftp提供了一个像FTP一样的命令行界面。例如:sftp user@hostname

  8. sshfs:在本地主机上通过SSH将远程主机的文件系统挂载到本地文件系统中。这样可以方便地访问远程文件。例如:sshfs user@hostname:/path/to/remote/dir /path/to/local/dir

  9. sshd:SSH守护进程,用于监听SSH连接请求,并处理SSH连接。例如:sudo service sshd start

  10. ssh_config:SSH客户端的配置文件,用于设置SSH各种参数和选项。例如:/etc/ssh/ssh_config

详解用法

Note

在这些指令中,bxhu认为使用频率较高的是:ssh, scp, sftp, ~/.ssh

ssh

significant

ssh(Secure Shell)命令用于通过SSH协议连接到远程主机。它可以实现加密的远程登录和命令执行。

模板

Bash
1
ssh user@hostname
这条命令会通过SSH连接到hostname(远程主机),使用用户名user

ssh-keygen

ssh-keygen命令用于生成SSH密钥对。密钥对包含公钥和私钥,用于无密码登录和身份验证。

模板

Bash
1
ssh-keygen -t rsa

这条命令会生成一个RSA密钥对。默认情况下,密钥会存储在~/.ssh/目录下。

这一部分可以具体参见Github with SSH gen rsa

比如这是bxhu的 ~/.ssh

Bash
1
2
 ls
 config   id_rsa   id_rsa.pub   id_rsa_GithubConnection   id_rsa_GithubConnection.pub   known_hosts  󰁯 known_hosts.old

ssh-copy-id

ssh-copy-id命令用于将公钥复制到远程主机,以实现无密码登录。它会将公钥追加到远程主机的~/.ssh/authorized_keys文件中。

模板

Bash
1
ssh-copy-id user@hostname

这条命令会将本地用户的公钥复制到远程主机hostname上的user账户。

这会将公钥追加到远程主机的hostname账户下的~/.ssh/authorized_keys文件中

ssh-add

ssh-add命令用于将私钥添加到SSH代理(ssh-agent)中,以便后续的SSH会话可以使用该私钥进行身份验证。

模板

Bash
1
ssh-add ~/.ssh/id_rsa

这条命令会将指定的私钥(~/.ssh/id_rsa)添加到SSH代理中。

ssh-agent

ssh-agent是一个SSH代理程序,用于管理私钥并在内存中安全地保存私钥。

模板

Bash
1
eval `ssh-agent`

这条命令会启动SSH代理,并将环境变量配置为使用该代理。

scp

significant

scp(Secure Copy)命令用于通过SSH在本地主机和远程主机之间传输文件。

模板

Bash
1
scp localfile user@hostname:remotefile

这条命令会将本地文件localfile复制到远程主机hostname上的remotefile位置。

比如我要把本地的/Users/huluobo/code_projects/Julia/文件夹(及其所有子文件系统)拷贝进到远程的/home/bxhu文件夹中:

scp默认情况下只处理单个文件,但可以使用-r选项递归地传输目录及其内容

Bash
1
scp -r /Users/huluobo/code_projects/Julia/ [email protected]:/home/bxhu

现在进sugon的bxhu下查看

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
bxhu@sugon:~$ ls
Julia  msccl  nccl-tests  ns3-datacenter  ns-3-dsh  README.md

bxhu@sugon:~/Julia$ ls
mit18330
bxhu@sugon:~/Julia$ cd mit18330/
bxhu@sugon:~/Julia/mit18330$ ls
chapter1.jl
bxhu@sugon:~/Julia/mit18330$
# Administrator 还没有配tree :(

sftp

significant

sftp(Secure File Transfer Protocol)命令用于通过SSH进行交互式文件传输。它提供了类似FTP的命令行界面。

模板

Bash
1
sftp user@hostname

这条命令会启动一个与远程主机hostname的SFTP会话,使用用户名user

远程连接会话:

进入SFTP会话后,您可以使用以下命令进行文件操作:

ls:列出当前远程目录的文件和子目录

Bash
1
sftp> ls

pwd:显示当前远程工作目录

Bash
1
sftp> pwd

lcd:切换本地工作目录

Bash
1
sftp> lcd /path/to/local/dir

此时选中的本地工作目录就是“文件传输”的“本地端”

cd:切换远程工作目录

Bash
1
sftp> cd /path/to/remote/dir

此时选中的远程指定工作目录就是“文件传输”的“远程端”

get:从远程主机下载文件到本地

Bash
1
sftp> get remote_file

如果要下载或上传目录,需要使用 get -rput -r 选项来递归处理目录内容。单独使用 get 或 mget 只能处理单个文件,而不能处理目录。

put:将本地文件上传到远程主机

Bash
1
sftp> put local_file

mget:从远程主机下载多个文件到本地

Bash
1
sftp> mget remote_files

mput:将多个本地文件上传到远程主机

Bash
1
sftp> mput local_files

mkdir:在远程主机上创建新目录

Bash
1
sftp> mkdir new_directory

rmdir:删除远程主机上的目录

Bash
1
sftp> rmdir directory

rm:删除远程主机上的文件

Bash
1
sftp> rm file

bye 或 exit:退出SFTP会话

Bash
1
sftp> bye

example (新建):

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 sftp [email protected]
Connected to igw.dfs.net.
sftp> ls
Julia  README.md  msccl  nccl-tests  ns-3-dsh  ns3-datacenter
sftp> lcd /Users/huluobo # 选中本地端
sftp> cd /home/bxhu # 选中远程端
# 从remote下载到local
sftp> get -r Julia
Fetching /home/bxhu/Julia/ to Julia
Retrieving /home/bxhu/Julia
.DS_Store 100% 6148    57.5KB/s   00:00
Retrieving /home/bxhu/Julia/mit18330
chapter1.jl 100%   12KB 103.5KB/s   00:00
Retrieving /home/bxhu/Julia/.vscode
settings.json 100%   38     0.4KB/s   00:00
# 从local推送到remote
sftp> put /Users/huluobo/code_projects/LaTeX
Uploading /Users/huluobo/code_projects/LaTeX/ to /home/bxhu/LaTeX
local "/Users/huluobo/code_projects/LaTeX/" is not a regular file
sftp> put -r /Users/huluobo/code_projects/LaTeX
Uploading /Users/huluobo/code_projects/LaTeX/ to /home/bxhu/LaTeX
Entering /Users/huluobo/code_projects/LaTeX/
test.fls 100%   22KB 278.1KB/s   00:00
test.log 100%   17KB 293.9KB/s   00:00
test.aux 100%  129     2.5KB/s   00:00
test.xdv 100%  956    18.4KB/s   00:00
test.pdf 100%   10KB 192.6KB/s   00:00
test.synctex.gz 100% 1351    25.6KB/s   00:00
test.fdb_latexmk 100% 7666   138.0KB/s   00:00
test.tex 100%  301     5.7KB/s   00:00
sftp> ls
Julia  LaTeX  README.md  msccl  nccl-tests  ns-3-dsh  ns3-datacenter
sftp> bye
Note
  • rmdir 命令只能删除空目录
  • 如果您尝试删除一个包含文件或子目录的目录,将会失败。要删除非空目录,可以先递归删除目录内的所有文件和子目录,再删除该目录
  • 在 sftp 会话中没有直接的命令来递归删除目录。因此,通常情况下,可以通过 ssh 连接到远程主机,并使用 rm -rf 命令来递归删除目录

sshfs

sshfs命令用于通过SSH将远程主机的文件系统挂载到本地文件系统中。这样可以方便地访问远程文件。

模板

Bash
1
sshfs user@hostname:/path/to/remote/dir /path/to/local/dir
这条命令会将远程目录/path/to/remote/dir挂载到本地目录/path/to/local/dir

sshd

sshd(SSH Daemon)是SSH守护进程,用于监听SSH连接请求并处理SSH连接。

模板

Bash
1
sudo service sshd start

这条命令会启动sshd服务,允许远程主机连接到本机。

ssh_config

significant

ssh_config是SSH客户端的配置文件,用于设置SSH的各种参数和选项。它通常位于/etc/ssh/ssh_config~/.ssh/config

示例配置

Text Only
1
2
3
4
5
Host github.com
  User git
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  Port 22

这个配置块指定了在连接到github.com时使用的用户名、主机名、私钥文件和端口号。