Linux中的ssh和scp | 青训营

172 阅读4分钟

SSH

远程登录服务器

ssh user@hostname

  • user 用户名
  • hostname IP地址或域名

之后再输入密码即可登录成功。

第一次连接服务器会让你确认是否登录,输入yes即可,这样会将该服务器的信息记录在~/.ssh/known_hosts文件中。

ssh默认使用的是22号端口,如果配置成了其他端口可以ssh user@hostname -p 22 将22换成其他端口号


退出服务器

exitctrl + d 都可以退出


保存服务器信息

每次登录服务器都要ssh 输入userhostname是有点繁琐的,我们可以保存服务器信息用一个别名替代。

具体操作如下:

  1. 在家目录进入.ssh文件夹,如果没有直接mkdir .ssh创建一个就行了。可以使用ls -a查看是否有 .ssh 这个隐藏文件

  2. 创建一个叫config的文件

  3. 在文件中写入以下代码:

    Host myserver
        HostName IP地址或域名
        User 用户名
    

这样我们就可以用 别名(myserver) 代替任何的 user@hostname 了。

我们也可以在文件里面写多个服务器信息:

Host myserver1
    HostName IP地址或域名
    User 用户名
​
Host myserver2
    HostName IP地址或域名
    User 用户名

ssh密钥(免密登录)

user@hostname 已经配置好了不用记了,那么password 是不是也有方法可以不用记呢?

我们可以使用ssh-keygen 生成一个密钥。输入ssh-keygen之后,会有三个问题:

第一个问题是保存路径,回车默认就好,会保存在.ssh 文件夹中,

第二个问题是密钥密码,默认的话就是无密码。

第三个问题是确认密码。

进入.ssh 文件夹发现多了两个文件

  • id_rsa 私钥,不能随便给别人看
  • id_rsa.pub (public)公钥,无所谓随便给

为什么我要搞免密登录,还要多搞出来这几个密码呢?

我们需要再一次使用密码登录服务器,在服务器上保存我们的 ssh公钥,让服务器知道我们是知道密码的可信赖用户,之后就可以不用密码登录服务器了。

那么接下来进入服务器,在家目录下进入.ssh文件夹,如果没有的话创建一个就行了。

将公钥中的内容,复制到服务器中的~/.ssh/authorized_keys文件里即可。多个密钥的话记得使用回车隔开

到这里就成功了,我们ctrl + d退出服务器,再重新ssh登录服务器试一下,发现直接ssh + 之前取得别名就可以登录了。

上面是具每一步骤的方法,我们也可以使用下面的命令一键式操作(生成密钥之后)。

ssh-copy-id user@hostname ,这里的 user@hostname同样也可以使用别名代替,比如我之前设置的myserver

当然,第一次添加也是需要输入密码的


不登录运行服务器

我们在终端中使用ssh user@hostname 'command' 可以直接在服务器上跑后面的command

例如:

ssh user@hostname 'ls -a' 输出的是服务器中的ls -a

ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done' 输出的是服务器中计算的结果

SCP

通过ssh实现的文件复制命令,可以用于实现在不同服务器中传文件

命令格式:scp source destination,将source路径下的文件复制到destination

一般从服务器之间传文件可以从服务器传到本地,再从本地传到服务器,可以避免服务器相互之间的授权问题。

传文件

source路径下的文件复制到destination中,这里的路径如果是其他服务器的话要写成user@hostname:路径

例如将终端内的a.txt 传到myserver服务器的save文件夹中,这里save文件夹一定要存在不然会报错

  • scp a.txt myserver:save

默认相对路径是home开始,这其实就相当于scp a.txt myserver:/home/save

也可以重命名,例如scp a.txt myserver:save/b.txt


传文件夹

-r:如果是要上传文件夹的话需要在scp之后加上-r参数

例如:scp -r dir myserver:save

当然也可以重命名,如scp -r dir myserver:save/dir2


一次传送多个文件/文件夹

只要在source中空格隔开就行了

命令格式:

  • scp source1 source2 destination

多个source可以同时包含文件和文件夹,但是只要包含了文件夹就要记得加-r参数


端口不为22

ssh的默认端口是22,如果不是22的话我们可以使用-p 来指定端口

命令格式:

  • scp -P 22 source1 source2 destination