首页
关于
友链
统计
更多
留言
Search
1
centos7下源码编译安装Lnmp环境
489 阅读
2
Centos 8 安装samba服务
426 阅读
3
golang库-GoCV
306 阅读
4
Golang 通用后台权限管理系统 (Go-Funny-CMS)
240 阅读
5
nginx、apache启用HSTS
207 阅读
其他
前端
JavaScript
后端
Linux
PHP
golang
登录
Search
标签搜索
linux
php
golang
golang库
github
加速器
mysql
nginx
apache
lnmp
虚拟内存
JavaScript
nodejs
redis
流星Aday
累计撰写
14
篇文章
累计收到
0
条评论
首页
栏目
其他
前端
JavaScript
后端
Linux
PHP
golang
页面
关于
友链
统计
留言
搜索到
14
篇与
流星aday
的结果
2021-10-27
记一些工作常用的工具包函数——golang
//ReverseString 反转字符串 func ReverseString(s string) string { runes := []rune(s) for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 { runes[from], runes[to] = runes[to], runes[from] } return string(runes) } //Exists 判断文件存在 func Exists(path string) bool { _, e := os.Stat(path) return e == nil || os.IsExist(e) } //ShellExec 运行命令 func ShellExec(command string, arg ...string) (string, error) { var builder strings.Builder _, _ = builder.WriteString(command) for _, v := range arg { _, _ = builder.WriteString(" ") _, _ = builder.WriteString(v) } stdOut, stdErr, e := RunCmdAndGetOutput(exec.Command("/bin/bash", "-c", builder.String())) if e != nil { e = errors.New(stdErr) } return stdOut, e } //ShellExecBackends 后台运行命令 func ShellExecBackends(command string, arg ...string) error { var builder strings.Builder _, _ = builder.WriteString(command) for _, v := range arg { _, _ = builder.WriteString(" ") _, _ = builder.WriteString(v) } cmd := exec.Command("/bin/bash", "-c", builder.String()) if e := cmd.Start(); e != nil { return gerror.Wrap(e, "ShellExecBackends") } go cmd.Wait() //避免僵尸进程 return nil } //PostFormRequest post表单请求,超时30s //url 请求api //data 数据 //ssl 是否关闭ssl,true关闭 func PostFormRequest(url string, data url.Values, ssl bool) ([]byte, error) { client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: ssl}, }, } client.Timeout = time.Second * 30 form, err := client.PostForm(url, data) if err != nil { return nil, gerror.Wrap(err, "PostFormRequest") } defer form.Body.Close() res, err := io.ReadAll(form.Body) if err != nil { return nil, gerror.Wrap(err, "PostFormRequest1") } return res, nil } //GetRequest get请求 //url 请求api //header 请求头 //ssl 是否关闭ssl,true关闭 func GetRequest(url string, header http.Header, ssl bool) ([]byte, error) { request, err := http.NewRequest("GET", url, nil) if err != nil { return nil, gerror.Wrap(err, "GetRequest") } client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: ssl}, }, } request.Header = header response, err := client.Do(request) if err != nil { return nil, gerror.Wrap(err, "GetRequest1") } defer response.Body.Close() res, err := io.ReadAll(response.Body) if err != nil { return nil, gerror.Wrap(err, "GetRequest2") } return res, nil } //GetStringMd5 计算字符串md5 func GetStringMd5(str string) string { h := md5.New() _, _ = h.Write([]byte(str)) return hex.EncodeToString(h.Sum(nil)) } //GetFileMd5 计算文件md5 func GetFileMd5(file string) (string, error) { f, err := os.Open(file) if err != nil { return "", err } defer f.Close() hash := md5.New() if _, err = io.Copy(hash, f); err != nil { return "", err } return hex.EncodeToString(hash.Sum(nil)[:16]), nil } //WatchFile 监听文件修改 func WatchFile(file string, fn func()) { //创建一个监控对象 watcher, err := fsnotify.NewWatcher() if err != nil { logrus.Warning("WatchFile:", err) return } if err = watcher.Add(file); err != nil { logrus.Warning("WatchFile1:", err) return } //启动一个协和监听config是否被修改 go func() { ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP) <-ch _ = watcher.Close() }() //另启一个goroutine来处理监控对象的事件 go func() { for { select { case event, ok := <-watcher.Events: if !ok { return } if event.Op&fsnotify.Write == fsnotify.Write { fn() } case err, ok := <-watcher.Errors: if !ok { return } logrus.Warning("WatchFile2:", err) } } }() } //SwitchUserRight 切换到指定用户权限(用户及组)仅对文件操作生效,会影响当前协程的向下执行逻辑及所有子函数 //切换时注意需权限控制的异步io是否运行完毕,否则可能会才出现权限问题 //name 为空则切换回程序执行用户 func SwitchUserRight(name ...string) error { var uid, gid int var userInfo *user.User if len(name) == 0 { u, e := user.Current() if e != nil { return gerror.Wrap(e, "SwitchUserRight1") } userInfo = u } else { u, e := user.Lookup(name[0]) if e != nil { return gerror.Wrap(e, "SwitchUserRight2") } userInfo = u } gid, e := strconv.Atoi(userInfo.Gid) if e != nil { return gerror.Wrap(e, "SwitchUserRight3") } uid, e = strconv.Atoi(userInfo.Uid) if e != nil { return gerror.Wrap(e, "SwitchUserRight4") } if e = syscall.Setfsgid(gid); e != nil { return gerror.Wrap(e, "conversion failure1") } if e = syscall.Setfsuid(uid); e != nil { return gerror.Wrap(e, "conversion failure2") } return nil } //CheckPort 检测端口是否占用 //return true被占用 false未被占用 func CheckPort(port uint16) (bool, error) { conn, err := net.DialTimeout("tcp", fmt.Sprintf("0.0.0.0:%d", port), 3*time.Second) if err != nil { return false, nil } _ = conn.Close() return true, nil } func main() { //接收参数 daemon := flag.Bool("D", false, "Run in daemon mode") flag.Parse() //后台运行 if *daemon && os.Getppid() != 1 { //判断当其是否是子进程,当父进程return之后,子进程会被系统1号进程接管 filePath, err := filepath.Abs(os.Args[0]) if err != nil { log.Fatalln(err) } cmd := exec.Command(filePath) cmd.Stdin = nil cmd.Stdout = nil cmd.Stderr = nil if err = cmd.Start(); err != nil { log.Fatalln(err) } return } //监听进程信号,优雅退出 go func() { ch := make(chan os.Signal, 1) signal.Notify(ch, unix.SIGINT, unix.SIGTERM, unix.SIGQUIT, unix.SIGHUP) <-ch os.Exit(0) }() } //FileSizeFriendly 文件大小人性化 //size单位B func FileSizeFriendly(size int64) string { if size < 1024 { return fmt.Sprintf("%.2fB", float64(size)) } if size < (1024 * 1024) { return fmt.Sprintf("%.2fKB", float64(size)/float64(1024)) } if size < (1024 * 1024 * 1024) { return fmt.Sprintf("%.2fMB", float64(size)/float64(1024*1024)) } if size < (1024 * 1024 * 1024 * 1024) { return fmt.Sprintf("%.2fGB", float64(size)/float64(1024*1024*1024)) } if size < (1024 * 1024 * 1024 * 1024 * 1024) { return fmt.Sprintf("%.2fTB", float64(size)/float64(1024*1024*1024*1024)) } return fmt.Sprintf("%.2fEB", float64(size)/float64(1024*1024*1024*1024*1024)) }
2021年10月27日
123 阅读
0 评论
4 点赞
2021-08-24
golang调试工具-delve
安装Windowsgo get github.com/go-delve/delve/cmd/dlv安装目录为GOPATH/bin/dlv直接在cmd运行dlv可查询参数信息linuxgo get github.com/go-delve/delve/cmd/dlv安装目录为$GOPATH/bin/dlv如果是root用户使用可以直接运行ln -s /root/go/bin/dlv /usr/local/bin/添加为环境变量不为root用户则修改~/.bashrc或者/etc/profile,末尾添加export PATH="$GOPATH/bin/dlv"保存,运行source ~/.bashrc或者source /etc/profile刷新环境变量使用配置gland,步骤如下:输入监听端口和目标ip,点击确定。使用dlv debug --listen 2345 --api-version 2 ./main.go
2021年08月24日
180 阅读
0 评论
4 点赞
2021-07-17
Centos 8 安装samba服务
介绍samba是在linux系统上实现smb协议的一个免费软件,由服务器及客户端程序构成。samba最大的作用就是可以用于linux与windows系统直接的文件共享和打印共享,samba既可以用于windows与Linux之间的文件共享,也可以用于linux与linux之间的资源共享。安装sambadnf -y install samba samba-client 修改配置vim /etc/samba/smb.conf部分配置介绍#全局配置 [global] server string=smb文件共享服务 #设定samba server的注释,支持变量 t%-访问时间 I%-客户端IP m%-客户端主机名 M%-客户端域名 S%-客户端用户名 workgroup = samba #设定samba server加入的工作组或者域 security = user #设置用户访问samba server的验证方式,一共有四种验证方式。 #share:不需要提供用户名和密码,安全性能较低。 #user:samba server共享目录只能被授权的用户访问,由samba server负责检查账号和密码的正确性。账号和密码要在本samba server中建立。 #server:依靠其他sindows NT/2000或samba server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的sindows用户和口令集中到一个NT系统上,使用windows NT进行samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,samba将使用用户级安全模式作为替代的方式。 #domain:域安全级别,使用主域控制器(PDC)来完成认证。 passdb backend = tdbsam #用户后台。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam是security account manager(安全账户管理)的简写。 printing = cups #设置samba共享打印机的类型。现在支持的打印系统有:bsd, sysv, plp, lprng, aix, hpux, qnx printcap name = cups #设置共享打印机的配置文件。可为路径:/etc/printcap load printers = yes #设置是否在启动samba时就共享打印机。 cups options = raw #通用Unix打印系统配置参数 interfaces = lo ens33 192.168.157.129/24 127.0.0.1/24 #设置samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址,空格分隔。 guert account = pcguest #设定访问samba server的来宾帐户(即访问时不用输入用户名和密码的帐户,也就是匿名用户),若设为pcguest的话则为默认为nobody用户。 log file = /var/log/samba/%m.log #日志文件的储存位置和文件名(%m代表客户端主机名) max log size = 0 #设定日志文件的最大容量,单位KB,这里的预设值0代表不做限制。 password server = 127.0.0.1 #指定某台服务器(包括windows 和 linux)的密码,作为用户登入时验证的密码。此项需配合security = server时,才可设定本参数。 password level = 8 #密码位数 username level = 4 #用户名位数 encrypt passwords = Yes #设定是否对samba的密码加密。 smb passwd file = /etc/samba/smbpasswd #设定samba的密码文件 local master = no #设定samba server是否要担当LMB角色(LMB负责收集本地网络的Browse List资源),通常无特殊原因设为no os level = 33 #设定samba server的os level. os level从 0 到 255 . winNT的os level为33, win95/98的os level 是 1 .若要拿samba server 当LMB或DMB则它的os level至少要大于NT的33以上。 domain master = no #设定samba server是否要担当DMB角色(DMB会负责收集其他子网的Browse List资源),通常无特殊原因设为no preferred master = yes #设定samba server是否要担当PDC角色(PDC会负责追踪网络帐户进行的一切变更),通常无特殊原因设为no,(同一网段内不可有两个PDC,他们会每5分钟抢主控权一次) wins support = yes #设定samba server是否想网络提供WINS服务,通常无特殊原因设为no。除非所处网络上没有主机提供WINS服务且需要此台samba server提供WINS服务是才设yes,其他wins support和wins server只能选择一个 wins server = 192.168.0.1 #设定samba server是否要使用别台主机提供的WINS服务,通常无特殊原因设为no。除非所处网络上有一台主机提供WINS服务才要设yes,其他wins support和wins server #分享的资源名称 [homes] comment = Home Directories #描述 admin users = root #该共享的管理者,多个用户中间用逗号隔开 valid users = %S,%D%w%S #允许访问该共享的用户,多个用户或者组中间用逗号隔开,如果要加入一个组就用"@+组名"表示。%S表示目录登录用户 browseable = Yes #是否隐藏目录(知道目录同样可以访问) read only = No #是否只读 inherit acls = Yes #是否继承acl权限设置 public = No #不允许匿名用户访问,Yes允许 path = /var/tmp #共享目录路径,可以用%u、%m这样的宏来代替路径里的lnix用户和客户机的netbios名,用宏表示主要用于[homes]共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以这样写:path = /home/share/%m 。 create mask = 0600 #控制用户端创建文件的权限 write list = @printadmin root #允许写入该共享的用户 force group = @printadmin #指定存取资源时须以此设定的群组使用者进入才能存取(@组名) force user = root #指定存取资源时须以此设定的使用者进入才能存取(用户名) directory mask = 0775 #控制用户端创建目录的权限 allow hosts = 192.168.157. #设定只有此网段/IP的用户才能访问共享资源 allwo hosts = 192.168.156. #allow hosts的排除ip deny hosts = 1.1.1. #设定只有此网段/IP的用户不能访问共享资源 writable = yes #是否可写 printable = no #是否为共享段打印机也可查看 /etc/samba/smb.conf.example文件获取详细介绍配置示例假如我现在需要配置一个work共享目录,配置如下:[global] server string=smb文件共享服务 workgroup = root security = user passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw interfaces = lo ens33 192.168.157.129/24 127.0.0.1/24 max log size = 0 [work] comment = work目录 admin users = root valid users = @root browseable = No read only = No inherit acls = Yes public = No path = /work create mask = 0644 directory mask = 0744 write list = root force group = @root force user = root allow hosts = 192.168.157.可使用testparm命令来查看配置是否正常其他设置smbpasswd -a root #先设置登入用户及密码,需要与smb.conf中的admin users配置一致 systemctl stop firewalld.service #临时关闭防火墙 systemctl disable firewalld #禁止开启启动 setenforce 0 #临时关闭SELinux权限 vim /etc/selinux/config #永久关闭,将SELINUX=enforcing改为SELINUX=disabled,然后保存退出。启动服务systemctl restart smb systemctl enable smb
2021年07月17日
426 阅读
0 评论
6 点赞
2021-06-20
Golang 通用后台权限管理系统 (Go-Funny-CMS)
Golang 通用后台权限管理系统 (Go-Funny-CMS)线上地址演示https://admin-go.surest.cn 账号: surest 密码: 123456预览项目地址前端项目: https://github.com/Lets-Go-together/go-funny-cms-front后端项目: https://github.com/Lets-Go-together/go-funny-cms项目简介是一个简单版本使用 Casbin + Golang 开发的通用后台权限管理系统项目结构参考了Laravel初始化目录结构,更加便于 phper 进行开发和学习目前采用的技术栈如下golanggingorm(等)vue + design-vuecasbin采用前后端分离的开发方式快速安装#后端项目 https://github.com/Lets-Go-together/go-funny-cms.git cd go-funny-cms #导入sql: backups/funy_cms_20210514_153117.sql.gz cp .env .env.example go run main.go #或者 air #前端项目 https://github.com/Lets-Go-together/go-funny-cms-front.git cd go-funny-cms-front yarn install npm run dev配置邮件发送#后台运行 go run main.go express-run额外命令参考pkg/command/command.go目前支持功能后台账号管理用户权限控制自动权限路由生成RABC + ABC权限控制自定义控制菜单栏邮件发送与处理目录结构目前此系统未集成什么功能,非常便于二次开发进行,目录结构清晰- app :应用模块 (在次同级别目录,你可以同样创建app2目录) - http :api 接口操作相关 - admin : 根据应用内模块区分 - controler : 控制器层 - validate : 关于reuqest 和 验证器都走这里 - index : 例如客户端api 模块 - 同上... - middleware : 用于中间件管理(可参考api 中间件的使用) - models : 模型 - service: 字如其名 (service层) - validates: 验证器的二次封装 - ... 中间的没什么好介绍的 - pkg : 自定义创建的一些包,便于二次开发和提取我的未来由于时间的关系或者我个人的关系,需要去做一些更重要更值得做的事情,所以就草草的收尾了这个项目,欢迎提出有趣的想法和见解,我们一起来个思想碰撞,我也在致力于做一些自己的产品。以上这个项目,如果有有趣的想法,欢迎一起讨论,再基础上继续开发我们都"不止于此" ~转发来自于:邓尘锋的博客
2021年06月20日
240 阅读
0 评论
7 点赞
2021-06-20
Windows GitHub加速器
github_ppvaWindows GitHub加速器原理获取GitHub距离本机最近cdn服务器ip,添加到本地hosts文件,跳过互联网dns解析,直接本地解析指向目标ip使用先安装go环境,需1.16版本及以上 git clone代码 记入项目根目录,运行:SET CGO_ENABLED=1 SET GOOS=windows set GOARCH=amd64 set GO111MODULE=on go build会生成一个.exe的执行文件,运行即可github地址下载地址
2021年06月20日
188 阅读
0 评论
8 点赞
1
2
3