0%

ssh远程执行后台作业时,在命令行最后添加&标识并不是太好用,ssh还是会挂起,无法正常退出,可以使用nohup,并且重定向其所有的三个标准输入输出来解决:

1
2
3
ssh -T server << EOF
nohup foobar >/dev/null 2>&1 </dev/null &
EOF

References:
[1]nohup

反引号backquote/backtick操作符默认是在本地命令行中展开的,因此如果要在远端执行此操作符有以下几种写法:

HereDoc

转义``或者$()

1
2
3
4
ssh -T server << EOFSSH
kill -9 \\\`pgrep -f 'foobar'\\\`
kill -9 \\$(pgrep -f 'foobar')
EOFSSH

或者将heredoc开始标志用单引号引用起来,指示shell不要解释heredoc中的特殊字符和指令

1
2
3
4
ssh -T server << 'EOFSSH'
kill -9 \`pgrep -f 'foobar'\`
kill -9 $(pgrep -f 'foobar')
EOFSSH

单独的脚本文件

将脚本写入单独的文件,然后:

1
$ cat foobar.sh ssh -T server

1
$ ssh -T server < foobar.sh

TLS-SNI-01已经deprecated,但certbot尚不支持tls-alpn-01验证方法,因此可以使用dehydrated或者acme.sh通过https来获取Let’s Encrypt证书。

下面使用acme.sh,由于使用80,443端口的权限,拷贝证书文件的权限以及reload nginx的权限等问题,使用acme.sh正确的姿势应该是使用root账户来运行。

安装

1
2
# curl https://get.acme.sh sh
# source ~/.bashrc # 使acme.sh alias生效

如果使用acme.sh standalone方式来获取证书,还需要安装socat

1
$ sudo apt install socat

http方式获取证书

http验证支持standalone、webroot或webserver(apache,nginx)方式获取证书,获取证书的过程不会破坏系统环境。

standalone方式,acme.sh会启动一个使用80端口的web server

1
# acme.sh --issue -d mydomain.com --standalone

80端口需要特权用户才能监听

webroot方式,指定正在运行的网站的root目录

1
# acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

webserver方式,指定使用的web server,目前支持apache和nginx

1
2
# acme.sh --issue -d mydomain.com --apache
# acme.sh --issue -d mydomain.com --nginx

默认申请的是RSA证书,acme.sh同样支持申请ECC证书,只要添加额外的--keylength参数即可,支持申请256和384位的ECC证书

1
# acme.sh --issue -d mydomain.com --standalone --keylength ec-256

安装证书

1
2
3
4
# acme.sh --installcert -d mydomain.com \\
--key-file /etc/nginx/ssl/mydomain.com.key \\
--fullchain-file /etc/nginx/ssl/fullchain.cer \\
--reloadcmd "systemctl force-reload nginx"

自动更新证书

acme.sh自动安装了crontab入口,acme.sh会自动记录下申请证书和安装证书的命令,所以会在设定的周期内自动自行这些指令。

手动更新证书

1
# acme.sh --renew -d example.com --force

或者ECC证书

1
# acme.sh --renew -d example.com --force --ecc

acme.sh自动更新

1
# acme.sh --upgrade --auto-upgrade

关闭自动更新

1
# acme.sh --upgrade --auto-upgrade 0

手动更新

1
# acme.sh --upgrade

卸载

1
# acme.sh --uninstall

References:
[1]Deploying Let’s Encrypt certificates using tls-alpn-01 (https)
[2]使用TLS-ALPN-01验证签发证书
[3]dehydrated
[4]acme.sh
[5]TLS ALPN without downtime
[6]acme.sh中文说明

windows平台生成的zip文件名是使用CP936也就是GBK编码的,导致这样的文件在linux平台utf-8环境下解压缩的时候文件名会成为乱码,这个问题由来已久,但并没有从zip那边有个根本性的解决方案。

可以使用python的zipfile模块来解决这个问题。

python3版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3

import os
import sys
import zipfile

print("Processing File " + sys.argv[1])

file=zipfile.ZipFile(sys.argv[1],"r");
for name in file.namelist():
utf8name=name.encode('cp437').decode('cp936')
print("Extracting " + utf8name)
pathname = os.path.dirname(utf8name)
if not os.path.exists(pathname) and pathname!= "":
os.makedirs(pathname)
data = file.read(name)
if not os.path.exists(utf8name):
fo = open(utf8name, "wb")
fo.write(data)
fo.close
file.close()

因为zipfile把所有非utf-8编码格式的文件名都作为cp437进行处理,因此需要先还原回cp437,然后重新编码为cp936。

python版本见Reference[1]。

References:

[1]Linux 下 zip 文件解压乱码解决方案

当配置了多个源,特别是添加backports源之后,一个package可能有多个候选版本
源是有优先级的,apt会默认从优先级高的源安装package

可以通过apt-cache来查看package候选版本信息

1
2
3
4
5
6
7
8
9
$ apt-cache policy tmux
tmux:
Installed: (none)
Candidate: 2.3-4
Version table:
2.8-1~bpo9+1 100
100 http://ftp.tw.debian.org/debian stretch-backports/main amd64 Packages
2.3-4 500
500 http://ftp.tw.debian.org/debian stretch/main amd64 Packages

可以看到backports源优先级比较低,所以默认安装并不会安装最新版本

可以通过指定版本来安装

1
$ sudo apt install tmux=2.8-1~bpo9+1

bpo就是backports的缩写,

或者指定从backports源里安装:

1
$ sudo apt install tmux -t stretch-backports

还可以查看源里多个版本的详细信息:

1
2
3
4
5
6
7
8
9
$ apt-cache show tmux
Package: tmux
Version: 2.8-1~bpo9+1
Installed-Size: 677
...
Package: tmux
Version: 2.3-4
Installed-Size: 620
...