lanbos'blog

gist工作流sftp搭建实践

最近装了两个服务器,对于web前端来说装环境这种事的确是头疼,准备下一步看看docker了。在配置lnmp的过程中看到lnmp.org官网提供的一键安装脚本很酷

1
wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh lnmp

其实就是用wget远程下载了lnmp的压缩包,解压,然后安装。wget配合远程的脚本的确是能实现很多的“一行命令安装(执行)**”。远程脚本有个很好的存放地点就是github提供的gist服务。于是结合wget,gist,python,shell实现了”一行命令装sftp”。

安装wget

wget是linux上标配的下载程序,mac上默认是没有wget程序的,需要用brew进行安装:

1
2
3
4
# 如果没有安装brew需要安装brew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安装wget
brew install wget

gist

gist服务是github提供的非常强大的功能,Gist介绍与用法.
我主要用gist的两个功能:

  1. 备份一些自用脚本和配置文件
  2. 用md写一些简单的便签便于分享,能在一定程度上代替云笔记
    gist配合gisto使用的话可以满足你对代码snippets管理和分享的全部幻想。(gisto墙内可能无法下载,请自行解决)

写脚本

整个sftp设置参考Linux(CentOS)上配置 SFTP,只是用python3让整个设置自动化,python2不一定兼容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: utf-8 -*-  
import os
import sys
import shutil
import re
try:
paths = sys.argv[1]
userName=sys.argv[2]
except:
paths = "www"
userName="sftpuser"


class SftpSetting():
def __init__(self):
self.pathName = "/datas/" + paths # sftp目录
self.usrName =userName # sftp用户名
self.filetxt = '''
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
Match User {1} #这行用来匹配用户__sftpFlagStatus
ChrootDirectory {0} #用chroot将用户的根目录指定到/datas/www ,这样用户就只能在/datas/www下活动
AllowTcpForwarding no
ForceCommand internal-sftp #指定sftp命令
'''.format(self.pathName, self.usrName)
self.step1_init()
self.step2_setfile1()
self.step3_setWritedir()
self.step4()
os.system("service sshd restart")
# 初始化用户组等

def step1_init(self):
str1 = "groupadd sftp&&useradd -g sftp -s /bin/false {1}&&passwd {1}&&mkdir {0}&&usermod -d {0} {1}".format(
self.pathName, self.usrName)
os.system(str1)
# 编辑sshd_config文件

def step2_setfile1(self):
fo = open("/etc/ssh/sshd_config", "r+")
s = fo.read() # 读出
fo.seek(0, 0)
str1 = re.sub(r'[\s]*[^#]Subsystem[\s]*sftp[\s]*\/usr\/libexec\/openssh\/sftp-server',
"Subsystem sftp /usr/libexec/openssh/sftp-server", s)
str2 = re.sub(
r'PasswordAuthentication[\s]*no', "PasswordAuthentication yes", str1)
fo.truncate() # 清空文件
fo.write(str2)
if "__sftpFlagStatus" not in str2:
fo.write(self.filetxt)
fo.close()
# 给sftp开放读写权限

def step3_setWritedir(self):
str1 = "chown -R root:root {0}&&chmod 755 {0}&&mkdir {0}/{1}&&chown -R {1}:sftp {0}/{1}/&&chmod 755 {0}/{1}/".format(
self.pathName, self.usrName)
os.system(str1)

def step4(self):
f = open("/etc/sysconfig/selinux", "r+")
s = f.read()
f.seek(0, 0)
f.truncate() # 清空文件
f.write(s.replace("SELINUX=enforcing", "SELINUX=disabled"))
f.close()


def main():
sftp = SftpSetting()


if __name__ == '__main__':
main()

写好脚本上传到gist:
https://gist.githubusercontent.com/lanbos/adac5634593c6eb3f8d20c84cd4100d4/raw/70389d8ec59349d7d128a0ca2fd57d1effb147ba/sftpSet.py

最终命令为:

1
wget https://gist.githubusercontent.com/lanbos/adac5634593c6eb3f8d20c84cd4100d4/raw/edd55f701b47371d81c9736f2082d7cb18e2ed9b/sftpSet.py&&python3 sftpSet.py www sftpuser

www为目录名,sftpuser为用户名。
本脚本在阿里云和谷歌云上实验成功,其他vps不保证。