获取ssh教程配套的远程服务器账号的信息
homework 4 getinfo
通过ssh登录
未来进行开发的时候,肯定不止一台服务器。
我们只需要一个终端,然后可以通过ssh登录到各台服务器上,进行操作。
租服务器,需要
- hostname:可以是ip地址,也可以是域名
- user
- password
本小节会讲解:ssh登录,免密登录配置等
基本用法
远程登录服务器
ssh user@hostname
user
:用户名hostname
:IP地址或域名
第一次登录时会提示
The authenticity of host 'xx.xx.xx.xx (xx.xx.xx.xx)' can't be established.
ECDSA key fingerprint is SHA256:iy23yyCe013/l+kpDGxnbJTPpG8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入yes
,然后回车即可。如此,会将该服务器的信息记录在~/.ssh/known_hosts
文件中,随后输入密码即可登录到远程服务器中。
要退出远程服务器,输入exit
即可,或者使用快捷键Ctrl + d
ssh默认使用的端口是22,如果想登录某一特定端口,使用
ssh user@hostname -p 22
配置文件
我们发现,使用ssh user@hostname
进行登录,ssh
后面那一串字符串还是太长了。此时我们可以通过配置文件,来给远程服务器配置一个简短的别名。
-
创建文件:
~/.ssh/config
-
在文件中配置服务器的信息
Host myserver1 HostName IP地址或域名 User 用户名 Host myserver2 HostName IP地址或域名 User 用户名
-
随后可以直接使用
ssh myserver1
进行登录
如果没有.ssh
文件夹的话,可以自己手动创建一个
密钥登录
使用ssh
,每次登录都要输入密码,很麻烦。如果想要免密登录,可以配置密钥登录,如下
-
创建密钥
ssh-keygen # 然后一直回车
-
执行结束后,
~/.ssh/
目录下会多出两个文件:id_rsa
:私钥id_rsa.pub
:公钥
之后,想免密登录某台服务器,就将公钥放到那台服务器上面即可。
例如,想要免密登录myserver1
服务器,则将公钥中的内容,复制到myserver1
中的~/.ssh/authorizaed_keys
文件(若不存在该文件,直接创建出来即可)(若有多个密钥,用换行隔开)
上面将公钥复制到远程服务器上的这一过程(将本地Terminal中的ssh公钥,复制到远程服务器~/.ssh/authorized_keys文件中), 也可以使用如下命令进行简化
ssh-copy-id myserver1
此时,直接ssh myserver1
,发现直接就登录上去了。
执行命令(扩展)
有时(在自动化运维场景下),我们可能需要登录到一台远程服务器上,执行一个命令(或操作),然后退出。则可以使用如下的命令格式
ssh user@hostname command
# command 这条命令,会自动在服务器端执行
例如
ssh user@hostname ls -a
或
ssh user@hostname 'for((i=0;i<10;i++)) do echo $i; done'
# 加上双引号或者单引号
# 注意, 此处, 要使用单引号
# 因为shell脚本中的单引号不会带有变量解析,则会将单引号的内容当成一个字符串传递给远程服务器
# 远程服务器上再执行这条命令,则会成功解析到$i
# 如果这里用双引号, 由于shell脚本中双引号会带有变量解析, 则上面的字符串在本地就会进行解析, 而本地没有i变量,所以$i会被解析成空,随后传递到远程服务器执行,就是输出了10个空
这样带command
的ssh,会将command
在服务器端执行时产生的stdout
,重定向到我们本地Terminal的stdout
。即可以在本地Terminal直接看到远程服务器执行command
后产生的输出。
当只有一台服务器时,我们可能会直接ssh登录,然后操作就是了。
但是,如果有100台服务器,都需要执行相同的一条命令,这时就不能一台一台服务器去登录,然后执行命令,退出(那样会把人累死)。
此时,使用带命令的ssh就非常的方便。
以后如果自己租云服务器,通常会得到一个root用户。但是做开发时不推荐在root用户下进行开发,因为root用户权限太大,容易把服务器搞坏。通常,租完服务器后,推荐先使用add user
命令,创建一个用户
通过ssh传文件
scp是基于ssh封装的一个命令,通过scp可以传输文件到远程服务器
我们cp
命令,是将本地的一个文件,复制到另外的位置。scp
就是将网络上的一个文件,复制到另一个位置
命令格式:
scp source destination
# 将 source 路径下的文件,复制到 destination 中
也可以一次复制多个文件
scp source1 source2 destination
复制文件夹:
例:
scp -r ~/tmp myserver1:/home/acs/
# 将本地家目录下tmp文件夹,复制到myserver1服务器中的/home/acs/目录下
scp -r ~/tmp myserver1:homework/
# 将本地家目录下的tmp文件夹,复制到myserver1服务器中的~/homework/目录下
scp -r myserver1:homework .
# 将myserver1服务器中的~/homework/文件夹,复制到本地的当前目录下
本地的路径很好定义,远程服务器的路径要怎么定义呢?
首先是服务器的地址user@hostname
,或者用配置的别名,然后加上一个冒号,后面跟服务器内部的目录路径(这个路径是相对服务器上的家目录来的)
比如,在本地新建一个tmp
文件夹,在tmp
文件夹里新建一个a.txt
随后退出到tmp
文件夹同级的目录下,执行命令
scp -r tmp myserver1:
即可将tmp
文件夹拷贝到myserver1
服务器的家目录下面
上面的示例都是本地和远程服务器之间的传输文件;如果想要在2台远程服务器(假设为A和B)之间传输文件呢?
通常,先将A上的文件,传输到本地,再从本地将文件传输给B(2步scp)
当然,也可以直接从A传输给B(前提是A和B之间要有ssh的授权)
由于scp是基于ssh,其传输文件使用的默认端口也是22,若要通过指定的端口来传输文件,则需要加上-P
参数(注意是大写P),例如
ssh -P 22 source1 source2 destination
注意-r
,-P
等参数一定要放在开头,不要放在最后
scp的实际应用场景:
使用scp来配置其他服务器的vim
和tmux
(将本地的相关配置文件,传输到远程服务器上)
scp ~/.vimrc ~/.tmux.conf myserver1:
后面会讲thrift,这是一个rpc通信框架(同类型的rpc框架还有dubbo,gRpc,待确定)。可以用于多台服务器之间的通信。thrift是一个跨语言的rpc通信框架。