通过ssh可以实现本地远程连接服务器,也能在本地远程连接的服务器上再远程连接到别的服务器,这个是允许进行套娃存在的。
ssh user@hostname
user
指的是用户名,一般服务器默认的用户名是root,也能自己更改
hostname
指的是服务器的IP地址或者域名
如果想要登录某一特定的端口
ssh user@hostname -p 端口号
退出服务器可以使用命令exit
或者ctrl+d
由于每次远程登录服务器要记住复杂的IP地址,因此我们可以在本地配置文件,给我们要连接的服务器取一个别名,之后就可以更方便地登录
创建配置文件~/.ssh/config
在文件中输入:
Host myserver1 #myserver1 就是一个服务器的别名
HostName IP地址或域名
User 用户名
# 回车空一行可以设置另外一台服务器的别名
Host myserver2
HostName IP地址或域名
User 用户名
# 之后就可以用别名进行ssh登录
ssh 别名
创建密钥,输入命令,然后一直回车
ssh-keygen
执行完命令之后,~/.ssh
文件夹底下就多了两个文件id_rsa
(私钥)和id_rsa.pub
(公钥)
之后想免密码登录哪个服务器,就将公钥传给哪个服务器即可。
例如,想免密登录myserver
服务器。则将公钥中的内容,复制到myserver
中的~/.ssh/authorized_keys
文件里即可。
(一键配置)在获得密钥之后也可以使用如下命令一键添加公钥:
ssh-copy-id myserver
配置成功之后就可以免密登录了。
通过本地Terminal对远程的服务器进行命令操作
ssh user@hostname command
例如:
ssh myserver ls -a
acs@0faa28a78e69:~/.ssh$ ssh myserver ls -a
.
..
.bash_logout
.bashrc
.cache
.profile
.ssh
或者
# 单引号中的$i可以求值,双引号中的$i不可以求值
ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done'
本地Terminal会首先将COMMAND
进行一遍解析,然后将解析得到的结果传给远端地服务器,让服务器代替我们的Terminal对传进去的COMMAND
进行解析再去执行
因此,我们可以知道,一个命令是要被解析两次
例如
ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done'
对于单引号中的命令,在本地解析之后就会得到纯字符串
ssh myserver for ((i = 0; i < 10; i ++ )) do echo $i; done
将这个纯字符串传到远端服务器,就会直接在服务器上的Terminal执行这段字符串所代表地命令
因此就可以执行
但是,如果是双引号
ssh myserver “for ((i = 0; i < 10; i ++ )) do echo $i; done”
在本地Terminal进行解析之后,首先他会将双引号中间的变量解析出来,由于本地没有变量i,默认为空,因此传过去地就是
for ((i = 0; i < 10; i ++ )) do echo ”“; done
最后在远端进行解析就会输出10次空。
再举一个例子
#! /bin/bash
ssh myserver mkdir homework/lesson_4/homework_4/\"$1\"
这是本地的remote_mkdir.sh
文件,传进去一个参数作为文件夹名称,要求通过这个可执行文件对远端服务器进行创建文件的操作
首先在本地会先解析一次,得到
ssh myserver mkdir homework/lesson_4/homework_4/"name 1"
然后传送到远端就是
mkdir homework/lesson_4/homework_4/"name 1"
远端进行解析就可以成功创建name 1
文件夹
但是如果没有转义呢?
ssh myserver mkdir homework/lesson_4/homework_4/"$1"
首先在本地得到
ssh myserver mkdir homework/lesson_4/homework_4/name 1
传送到远端执行的命令就是
mkdir homework/lesson_4/homework_4/name 1
会发现双引号被抹去了,这就导致,会创建两个文件夹
因此,总结就是
ssh命令中使用单引号,单引号中的所有变量都不会在本地进行解析引用
双引号中的所有变量会首先在本地进行解析引用,传到远端的时候双引号就会消失
想要让双引号保留,就使用斜杠进行转义
scp source destination
将source
路径下的文件复制到destination
中
一次复制多个文件:
scp source1 source2 destination
复制文件夹:
scp -r ~/tmp myserver:/home/acs/
将本地家目录中的tmp
文件夹复制到myserver
服务器中的/home/acs/
目录下。
scp -r ~/tmp myserver:homework/
指定服务器的端口号:
scp -P 22 source1 source2 destination
注意: scp
的-r -P
等参数尽量加在source
和destination
之前。
使用scp配置其他服务器的vim和tmux
一般新的服务器中的vim和tmux是最普通的,需要自己取配置,我们可以将本地的
.vimrc
和.tmux.config
文件scp到新服务器上就能实现配置了