SSH是一种网络协议,用于计算机之间的加密登陆。原理:html
当远程主机的公钥被接受之后,它就会被保存在本地文件~/.ssh/known_hosts之中,此外系统也有一个这样的文件,一般是/etc/ssh/ssh_known_hosts,保存一些对全部用户均可信赖的远程主机的公钥。前端
ssh user@remote -p port
# user 是你在远程机器上的用户名,若是不指定的话默认为当前用户
# remote 是远程机器的地址,能够是 IP,域名,或者是后面会提到的别名
# port 是 SSH Server 监听的端口,若是不指定的话就为默认值 22
# 好比我经常使用的 ssh zhm@120.79.52.223
复制代码
一般在本地电脑输入以上命令以后,远程服务器就会询问密码,你输入的时候是看不见任何波动,输入完回车就能够了~,若是报错ssh: connect to host remote port 22: Connection refused,说明服务器没有按照ssh server,Ubantu Desktop系统默认是没有这个的,安装命令sudo apt-get install openssh-servernode
每次 ssh 都要输入密码是否是很烦呢?与密码验证相对的,是公钥验证。也就是说,要实现免密码登入,首先要设置 SSH 钥匙。也就是本地电脑生成公钥私钥,而后把公钥放在远程服务器上就能够了! 原理很简单,就是用户将本身的公钥储存在远程主机上。登陆的时候,远程主机会向用户发送一段随机字符串,用户用本身的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,若是成功,就证实用户是可信的,直接容许登陆shell,再也不要求密码。linux
# 查看本地有没有
ls ~/.ssh
# 没有就生成
ssh-keygen
# 在~/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
# 把公钥放到远程服务器
ssh-copy-id user@remote -p port
# 好比个人 ssh-copy-id zhm@120.79.52.223
复制代码
ssh-copy-id基本都安装了,万一没有,mac上brew install ssh-copy-id。 windows麻烦点ssh user@remote -p port 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub,意思是在远端执行新建 .ssh 文件夹,并把本地的 ~/.ssh/id_rsa.pub (也就是公钥)追加到远端的 .ssh/authorized_keys 中。固然,不使用这条命令的话,你也能够手动操做这个过程,即先复制公钥,再登入远程机器,粘贴到 .ssh/authorized_keys 当中。git
每次都输入 ssh user@remote -p port,时间久了也会以为很麻烦,特别是当 user, remote 和 port 都得输入,并且还很差记忆的时候。配置别名可让咱们进一步偷懒。好比我想用ssh lab替换上面一串算法
# cat>>某文件<<EOF追加下内容, >> 追加的意思 <<EOF 遇到EOF终止
# 由于是前端,直接用vscode编辑
code ~/.ssh/config
# 追加如下内容,保存
Host lab
HostName remote
User user
Port port
# 来登陆吧
ssh lab
# 好比个人
# Host han
# HostName 120.79.52.223
# User zhm
# Port 22
# ssh han
复制代码
命令行执行登陆而且在目标服务器上执行命令:shell
# 单引号或者双引号,将命令包起来,而后分号隔开命令
ssh user@remoteNode "cd /home ; ls"
复制代码
若是是不少命令的话,须要建一个脚本。segmentfault
# 建一个脚本文件test.sh,里面写上这个,而后执行 sh test.sh
#!/bin/bash
# 远程执行的内容在"< < remotessh " 至" remotessh "之间,若是不想本机出现日志的话 ssh user@remoteNode >/dev/null 2>&1 << remotessh
ssh user@remoteNode << remotessh
ls
exit
remotessh
复制代码
两台机器间文件传输能够用scp,它的地址格式与 ssh 基本相同,都是能够省略用户名和端口,稍微的差异在与指定端口时用的是大写的 -P 而不是小写的。不过,若是你已经配置了别名,那么这都不重要,由于 scp 也支持直接用别名windows
# 总的:本机的能够省略电脑的ip,默认的远程当前文件夹是 Home目录(~),将A电脑上的文件复制到B电脑上
# 注意的地方:A如果文件,B电脑若也是文件的路径,无论文件存不存在,都会将A文件内容写入到B这个文件。
# B电脑如果文件夹,无论文件夹存不存在,都会在这个文件夹下生成A电脑同名的文件和内容,有的话则会覆盖同名文件
# A如果文件夹,加上-r,B电脑如果文件的路径会报错,B电脑如果文件夹路径,文件夹不存在的话则会创建这个文件夹且放入A文件夹里面的内容(至关于将A文件夹挪过去而后重命名),文件夹存在的话,会在这个文件夹下面生成一个和A同名的文件夹,里面内容一致
scp A电脑:文件路径 B电脑:文件路径
# 把本地的 /path/to/local/file 文件传输到远程的 /path/to/remote/file
scp -P port /path/to/local/file user@remote:/path/to/remote/file
# 也可使用别名
scp /path/to/local/file lab:/path/to/remote/file
# 把远程的 /path/to/remote/file 下载到本地的 /path/to/local/file
scp lab:/path/to/remote/file /path/to/local/file
# 远程的默认路径是家目录
# 下面命令把当前目录下的 file 传到远程的 ~/dir/file
scp file lab:dir/file
# 加上 -r 命令能够传送文件夹
# 下面命令能够把当前目录下的 dir 文件夹传到远程的家目录下
scp -r dir lab:
# 别忘了 . 能够用来指代当前目录
# 下面命令能够把远程的 ~/dir 目录下载到当前目录里面
scp -r lab:dir/ .
复制代码
若是以为使用命令行传输文件浑身不自在,你还可使用 SFTP 协议。任何支持 SFTP 协议的客户端都能用你的 SSH 帐号信息登入并管理文件,好比开源的有图形化界面的FTP客户端 FileZilla。别忘了,在这些客户端里面,你也能够指定你的私钥(~/.ssh/id_rsa),而后就能作到无密码登入了。bash
如下命令均在服务器执行
# 让程序在后台运行 好比 nohup node index.js &
nohup 一直执行的命令 &
# 看下任务号 node的那个
ps
# 若是须要终止的话
kill 21455
复制代码
tmux更能执行复杂的程序,tmux还能管理多个窗口,窗口切分,复制粘贴等等,mac用户使用tmux更方便,新建会话tmux -CC,恢复的时候tmux -CC attach
# 服务器上安装tmux
sudo apt-get install tmux
# 运行tmux,进入会话,此时运行任何东西都不会由于退出ssh而被杀死
tmux
# 暂时离开会话 ctrl+b 再按下d
# 恢复会话
# tmux attach
# tmux命令必须运行在服务器上
复制代码
以上内容来自ssh免密登陆服务器和scp的使用
1.scp 是 secure copy 的缩写,用于远程的文件的复制。
2.参数:
-r: 递归复制整个目录。
复制代码
3.实例:
scp /home/space/music/1.mp3 username@ip/home/root/others/music
scp /home/space/music/1.mp3 username@ip/home/root/others/music/001.mp3
复制代码
若是是远程复制目录就加上 -r 参数 便可(重命名目录,就直接在命令后面添加,前提保证目标地址没有该目录)
scp -r /home/space/music/ username@ip:/home/root/others/music_new
复制代码
把本地music目录复制到另外一台服务器的others下,并重命名为music_new
1.rsync 是 remote sync 的缩写,用于linux系统下的数据镜像备份工具,远程服务器之间的文件拷贝。 2.参数:
-a, --archive 归档模式,表示以递归方式传输文件,并保持全部文件属性,等于-rlptgoD。
-v, --verbose 详细模式输出。
-z, --compress 对备份的文件在传输时进行压缩处理。
-P, --partial 保留那些因故没有彻底传输的文件,以是加快随后的再次传输。
复制代码
3.实例:
rsync -avp mylog /home/
复制代码
scp是至关于复制,黏贴,若是有的话是覆盖,比较耗时间,不智能。
rsync是复制,若是有重复的文件,会直接跳过,并且他本身的算法优化。
scp是把文件所有复制过去,当文件修改后仍是把全部文件复制过去,rsync 第一次是把全部文件同步过去,当文件修改后,只把修改的文件同步过去。
一、基于scp,新增部署脚本文件,如deploy.sh
# 压缩文件,其中 dist为要上传的文件所在目录
echo 压缩部署包!
tar -zcvf dist.tar.gz dist/
# 上传到服务器(须要输入密码,若是已经进行过私钥配置,则不用),其中/home/savoygu/gusaifei 为上传文件所在目录
echo 上传文件
scp -r dist.tar.gz 帐号@服务器ip:服务器上传路径
# 登陆到服务器(须要输入密码,若是已经进行过私钥配置,则不用)
# 服务器环境开启
ssh 帐号@服务器ip -tt << EOF
# 进入目标目录
cd 服务器上传路径
# 解压
sudo tar -zxvf dist.tar.gz --strip-components 1
# 移除线上压缩文件
sudo rm -rf
exit
EOF
# 服务器环境结束
echo 上传完成!
# 移除本地压缩文件
echo 删除本地压缩包!
rm -rf dist.tar.gz
复制代码
使用rsync同理
二、前端使用脚本
"scripts": {
"deploy": "cross-env NODE_ENV=production umi build && ./deploy.sh"
}
复制代码
可结合gitlabCI,Travis CI实现持续集成,参考
一、权限问题
.ssh目录,以及/home/当前用户 须要700权限,参考如下操做调整
sudo chmod 700 ~/.ssh
sudo chmod 700 /home/当前用户
.ssh目录下的authorized_keys文件须要600或644权限,参考如下操做调整
sudo chmod 600 ~/.ssh/authorized_keys
复制代码
二、StrictModes问题
编辑
sudo vi /etc/ssh/sshd_config
找到
#StrictModes yes
改为
StrictModes no
复制代码