Hexo使用SFTP部署到个人服务器
官方文档在这:官方文档
安装依赖
npm install hexo-deployer-sftp --save
参数
deploy:
type: sftp
host: <host>
user: <user>
pass: <password>
remotePath: [remote path]
port: [port]
privateKey: [path/to/privateKey]
passphrase: [passphrase]
agent: [path/to/agent/socket]
含义:
| 参数 | 描述 | 默认值 |
|---|---|---|
host |
远程主机的地址。填ip或者域名都可以。必填。 | |
user |
远程主机的用户名。必填。 | |
pass |
远程主机的密码。可不写,与privateKey二选一。 |
|
remotePath |
远程主机的目录。 | / |
port |
远程主机的端口。 | 22 |
privateKey |
本机ssh私钥的目录地址。 | |
passphrase |
ssh私钥的密码。(可省略) | |
agent |
ssh套接字的目录地址。 | $SSH_AUTH_SOCK |
生成私钥和公钥
看了上面的参数,可以使用密码或者私钥登录。使用密码肯定是不安全的,所以选择使用私钥登录。
确定了登录方式,那么私钥和公钥哪里来?
Windows打开CMD窗口,输入生成公钥和私钥命令:ssh-keygen -m PEM -t rsa。Linux没测试,能执行这个命令应该都可以吧。
然后会问3个问题:
Enter file in which to save the key (C:\Users\zhoupb/.ssh/id_rsa):,意思是,你这个文件要保存到哪里去,叫什么名字,默认保存到括号里的地方去。可以按回车(使用默认值),或者输入名字。如果直接输入名字(如输入:test),会在当前目录生成(就是执行这条代码前面的路径。如C:\Users\zhoupb>ssh-keygen -m PEM -t rsa,就会生成到C:\Users\zhoupb这个目录中)。Enter passphrase (empty for no passphrase):意思是,要不要设置一个密码,直接按回车就不设置密码。Enter same passphrase again:确认密码,没设置密码直接按回车。
完了之后就会在指定目录中生成两个文件。
假设我是在C:\Users\zhoupb这里运行ssh-keygen -m PEM -t rsa这条命令的,我在回答第一个问题的时候,输入了test,没有设置密码。
那么,生成完成后,会在C:\Users\zhoupb这个目录下面生成test和test.pub两个文件。test是私钥,自己存着就好,test.pub是公钥,给别人存的。公钥是要放到远程主机中/home/xxx/.ssh/authorized_keys这个文件里去的。
配置公钥
给生成的test.pub里的内容,复制到/home/xxx/.ssh/authorized_keys这个文件中去,其中xxx是登录用户名(这个用户名就是参数中user的值),如果是root用户则是:/root/.ssh/authorized_keys。如果authorized_keys不存在就创建。
配置示例
修改_config.yml里deploy内容。
deploy:
type: 'sftp' # 类型写sftp,还有其他的类型,具体看官方文档
host: 'zhoupb.com' # 写ip和域名都可以,能访问主机就可以
# 我用的root用户,所以我要给公钥内容复制到/root/.ssh/authorized_keys这个文件中去。
user: 'root'
# 如果用着是admin用户,则:user: admin,公钥内容复制到/home/admin/.ssh/authorized_keys这个文件中去
# 如果authorized_keys这个文件不存在,创建一个就好。
# pass: <password> 不用密码,不写。用密码直接写密码就好。
remotePath: "/root/web" # 意味着会给文件上传到/root/web这个目录下去。默认是 /。
# port: [port] # 默认22
# 可以使用绝对路径,亦可用相对路径 ./test
privateKey: 'C:/Users/zhoupb/test'
# passphrase: [passphrase] #没设置密码,不写。设置了密码写密码
# agent: [path/to/agent/socket] # 没用到,不写
无注释
deploy:
type: 'sftp'
host: 'zhoupb.com'
user: 'root'
remotePath: "/root/web"
privateKey: 'C:/Users/zhoupb/test'
部署
hexo clean。我喜欢先clean一下,可以跳过。hexo g。生成静态文件。hexo d。上传到服务器。也就是部署。
生成的静态文件已经上传到服务器中指定目录中去了,至于怎么用,请随意。
其它(重要)
从Windows换到Debian后,不知道为什么该方法巨慢。
不如写一个脚本使用scp传到服务器里…
#!/bin/bash
hexo clean && hexo generate
# 服务器地址和路径
server="zhoupb.com"
user="hexo"
path="~/public"
# 使用 ssh 命令删除服务器上的目录
ssh -i "$(dirname "$0")/id_rsa" "$user@$server" "rm -rf $path/*"
# 使用 scp 命令将当前目录下的 public 文件夹传输到服务器
scp -r -i "$(dirname "$0")/id_rsa" -o "IdentitiesOnly=yes" -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "LogLevel=ERROR" public/* "$user@$server:$path"
