官方文档在这:官方文档

安装依赖

安装 hexo-deployer-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个问题:

  1. 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这个目录中)。
  2. Enter passphrase (empty for no passphrase): 意思是,要不要设置一个密码,直接按回车就不设置密码。
  3. Enter same passphrase again: 确认密码,没设置密码直接按回车。

完了之后就会在指定目录中生成两个文件。

假设我是在C:\Users\zhoupb这里运行ssh-keygen -m PEM -t rsa这条命令的,我在回答第一个问题的时候,输入了test没有设置密码

那么,生成完成后,会在C:\Users\zhoupb这个目录下面生成testtest.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.ymldeploy内容。

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'

部署

  1. hexo clean。我喜欢先clean一下,可以跳过。
  2. hexo g。生成静态文件。
  3. 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"