使用shell拉取代码并部署

#!/bin/bash

# @Author: admin
# @Date:   2023-11-22 17:20:22
# @Last Modified by:   admin
# @Last Modified time: 2023-11-22 20:58:01

# 添加部署脚本
# 首先给脚本执行权限 chmod +x ./deploy.sh
# 使用: ./gitee.sh
# 或: ./deploy.sh www  // www为最终发布目录的所属用户
# 源码将发布到 destDir设置的目录下

# read -p "请输入gitee账号 :" username

# while true
# do
#         if [ ! -n "$username" ];then
#                 read -p "必须输入请输入gitee账号 或者q退出:" username

#         else
#                 if [ "$username" = "q" ];then
#                         exit 0
#                     else
#                         break
#                 fi

#         fi

# done

# read -p "请输入gitee密码 :" password

# while true
# do
#         if [ ! -n "$password" ];then
#                 read -p "必须输入请输入gitee密码 或者q退出:" password

#         else
#                 if [ "$password" = "q" ];then
#                         exit 0
#                     else
#                         break
#                 fi

#         fi

# done


echo '--初始化目录--'
# 临时目录,多个仓库应该使用不同的临时目录
tmpDir="$(pwd)/.qqmasterTemp"
# 部署目录不能与脚本所有目录相同
newDir="$(pwd)/qqmaster"


if [ ! -e "$tmpDir" ];then

    mkdir "$tmpDir"
fi

if [ ! -e "$newDir" ];then

    mkdir "$newDir"
fi



# 代码仓库目录 deploy:gitlab-ci-token修改为部署令牌和密码,也可以是gitlab用户和密码
repository="https://gitee.com/wangzh/qqmaster.git"


# if [ -d $tmpDir ]
# then
#     rm -rf $tmpDir
# fi

echo '--拉取代码--'
git clone $repository $tmpDir

echo '--拉取完成--'

#切換分支
echo '--切換分支--'
cd $tmpDir && git checkout dev

echo '--刪除不能覆蓋的文件--'
cd $tmpDir && rm -rf ApiAdmin/.env && rm -rf ApiAdmin/config && rm -rf ApiAdmin/.git && rm -rf ApiAdmin/cert


# 拷贝源码到部署目录
echo '--拷贝源码到部署目录--'
cd $tmpDir && cp -rf "./" $newDir

echo '--为项目赋权--'
cd $newDir && sudo -S chown -R www:www ./*  && sudo -S chmod -R 755 ./*

echo '--移除临时目录--'
rm -rf $tmpDir


echo "--发布完成--"

此方法的好处是可以避免一些冲突提示

此方法的缺点是仓库用的是码云的,每次使用https方式拉取都要输入账号密码

Linux硬盘挂载

输入 lsblk-f 查看所有设备的挂载情况
2023-11-13T03:12:04.png
例如我的是 /dev/sdb

将新添加的硬盘分区 输入命令fdisk /dev/sdb
2023-11-13T03:12:11.png
输入p创建主分区
2023-11-13T03:12:29.png
默认1即可
2023-11-13T03:13:00.png

分区创建好了之后 输入 w 保存退出
2023-11-13T03:14:18.png

分区创建好了之后 将分区格式化 格式化命令 mkfs -t ext4 /dev/sdb
2023-11-13T03:14:55.png

所有操作完成后就可以开始挂载了
mount /dev/sdb /指定文件的路径

挂载完后后设置开机自动挂载

先使用 df -TH 查看硬盘列表
2023-11-13T03:17:24.png

查看挂载的磁盘属性
2023-11-13T03:18:44.png

打开配置文件,写入自动配置
2023-11-13T03:19:42.png

参数说明:
第一列为UUID,此处填写查询到的磁盘分区的UUID
第二列为磁盘分区的挂载目录,可以通过df -TH命令查询
第三列为磁盘分区的文件系统格式,可以通过df -TH命令查询
第四列为磁盘分区的挂载选项,此处通常设置为defaults即可
第五列为Linux dump备份选项
(1) 0表示不使用Linux dump备份。现在通常不使用dump备份,此处设置为0即可。
(2) 表示使用Linux dump备份。
第六列为fsck选项,即开机时是否使用fsck检查磁盘。
(1) 0表示不检验。
(2) 挂载点为(/)根目录的分区,此处必须填写1。
(3) 根分区设置为1,其他分区只能从2开始,系统会按照数字从小到大依次检查下去。

最后保存配置即可

sh脚本拉取线上代码部署网站

#!/bin/bash

# 添加部署脚本
# 首先给脚本执行权限 chmod +x ./deploy.sh
# 使用: ./deploy.sh
# 或: ./deploy.sh www  // www为最终发布目录的所属用户
# 源码将发布到 destDir设置的目录下

user=${1:-"none"}
# 当前用户密码,用于sudo提权
sudoPwd=""
# 临时目录,多个仓库应该使用不同的临时目录
tmpDir="$(pwd)/.deploy"
# 部署目录不能与脚本所有目录相同
destDir="$(pwd)/destDir"
# 代码仓库目录 deploy:gitlab-ci-token修改为部署令牌和密码,也可以是gitlab用户和密码
repository="http://deploy:gitlab-ci-token@git仓库地址"

echo '初始化目录'
if [ -d $tmpDir ]
then
    rm -rf $tmpDir
fi

echo '拉取代码'
git clone $repository $tmpDir

rm -rf $tmpDir/.git
echo '发布代码'
# 拷贝源码到部署目录
cp -rf $tmpDir $destDir

if [ "$user" != "none" ]
then
    if [ "$sudoPwd" = "" ]
    then
        echo '缺少用户密码'
        exit 1
    fi
    # 修改目录权限
    echo "$sudoPwd" | sudo -S chown -R $user: $destDir
fi

echo '移除仓库'
rm -rf $tmpDir

echo '发布完成'

搭建ssr

CentOS 6和7/Debian6+/Ubuntu14+ ShadowsocksR/Shadowsocks一键部署管理脚本:

yum -y install wget
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ss-go.sh && chmod +x ss-go.sh && bash ss-go.sh
  • 如果搭建SSR账号,请使用脚本一,目前推荐的SSR参数设置为以下,有利于突破网络封锁,参数如下:
  1. 加密方式:none 协议:origin 混淆:tls1.2_ticket_auth
  2. 加密方式:none 协议:auth_chain_a 混淆:tls1.2_ticket_auth
  3. 如果搭建SS账号,请使用脚本二,加密方式可选aes-256-gcm,或者高阶篇的SS+插件模式(推荐)
  4. 推荐搭建SSR账号。

安装完成后,快捷管理命令:

bash ssr.sh

编写shell脚本快速切换PHP版本

由于我是在windows的wsl搭建的PHP环境,包括7.3、7.4、8.0多个PHP版本,测试的时候,有的程序需要某个版本才能运行,手动创建环境变量太麻烦,于是写了我的第一个shell,于是记录下

#!/bin/bash
#第一次提示
read -p "请输入版本号【7.3】、【7.4】、【8】:" version

#如果未输入,则强制要求输入
while [ ! "$version" ]
        do
        if [ ! -n "$version" ]; then
                read -p "必须输入版本号【7.3】、【7.4】、【8】:" version
        fi
done


#先删除现在的环境
rm -rf /usr/bin/php
rm -rf /usr/bin/phpize
rm -rf /usr/bin/php-fpm

#根据输入的版本号创建新的环境变量
case $version in
        7.3)
                #echo "你输入了${version} (7.3 对吗?)"
                ln -s  /usr/local/php/bin/php /usr/bin/php
                ln -s  /usr/local/php/bin/phpize /usr/bin/phpize
                ln -s  /usr/local/php/sbin/php-fpm /usr/bin/php-fpm
        ;;
        7.4)
                #echo "你输入了${version}(7.4对吗)"
                ln -s  /usr/php/74/bin/php /usr/bin/php
                ln -s  /usr/php/74/bin/phpize /usr/bin/phpize
                ln -s  /usr/php/74/sbin/php-fpm /usr/bin/php-fpm
        ;;
        8)
                #echo "你输入了${version}(8对吗)"
                ln -s  /usr/local/php8/bin/php /usr/bin/php
                ln -s  /usr/local/php8/bin/phpize /usr/bin/phpize
                ln -s  /usr/local/php8/sbin/php-fpm /usr/bin/php-fpm
        ;;
        *)
                echo "当前系统未安装此版本号的PHP,无法切换"
        ;;
esac

#检查下是否成功切换
        echo "你已成功切换到${version}"![微信截图_20211029113209.png][1]
        echo "======================================================"
                php -v
        echo "======================================================"

请输入图片描述

解决TP5在命令行创建文件没有权限写入的方法

例如workerman指定user为www运行
在cli模式下创建的文件是root权限的,无法写入log导致程序无法执行

找到 thinkphp\library\think\log\driver\File.php 文件
write 方法中 最后一行添加以下代码

try {
//判断操作文件不是0777权限 就修改
if (substr(base_convert(fileperms($destination),10,8),-4) != '0777') {
  chmod($destination, 0777);
}
            
} catch (\Exception $e) {

}

Linux命令输出头(标题)、输出结果排序技巧

1、 Linux命令输出头(标题)
在使用Linux命令时,如果命令中有管道“|”,则输出的信息中,头(标题)信息丢失,要想看每一列代表什么意思很不方便。

这里有一个简单的办法,通过2条命令叠加,获取头和内容。例如ps auxw:

$ ps axuw
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  37888  5952 ?        Ss   01:21   0:02 /sbin/init noprompt
root         2  0.0  0.0      0     0 ?        S    01:21   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    01:21   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   01:21   0:00 [kworker/0:0H]

再加上管道符后

$ ps axuw | grep java
faster    8502  0.0  0.0  12948   972 pts/1    S+   02:15   0:00 grep java

可以看到头(标题)已经丢失。

怎么显示标题呢,这有一个简单的办法:

$ ps axuw | head -1;ps axuw | grep java
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
faster    8510  0.0  0.0  12948   940 pts/1    S+   02:17   0:00 grep java

也就是先用命令本身加“| head -1”取到头(标题),然后再使用该命令输出内容,两者叠加输出即得到所要结果。

2、输出结果排序
按列排序,数字大的在前:

root@ubuntu:/home/faster/Fastdfs/FastDFS# ps auxw | sort -rn -k6
root       851  0.2  1.6 408816 33224 ?        Ssl  01:21   0:10 /usr/bin/docker daemon -H fd://
root       868  0.0  0.6 213068 13320 ?        Ssl  01:21   0:02 containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime runc --start-timeout 2m
root      8452  0.0  0.3  95584  7212 ?        Ss   01:47   0:00 sshd: tiger [priv]
root       980  0.0  0.3  95464  7088 ?        Ss   01:21   0:00 sshd: tiger [priv]
root      1044  0.0  0.3  95464  7048 ?        Ss   01:23   0:00 sshd: tiger [priv]
root       854  0.0  0.3  65612  6616 ?        Ss   01:21   0:00 /usr/sbin/sshd -D
root       592  0.0  0.3 274592  6240 ?        Ssl  01:21   0:00 /usr/lib/accountsservice/accou

该例子,将第6列进行排序,最大的数排前面。

若只想看前10条的内容:

ps auxw | sort -rn -k6 | head -10

3、综合例子
将实际内存消耗最大的10个进程显示出来的命令:

ps auxw|head -1;ps auxw|sort -rn -k6|head -10

$ ps auxw|head -1;ps auxw|sort -rn -k6|head -10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       851  0.2  1.6 408816 33224 ?        Ssl  01:21   0:11 /usr/bin/docker daemon -H fd://
root       868  0.0  0.6 213068 13320 ?        Ssl  01:21   0:03 containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime runc --start-timeout 2m
root      8452  0.0  0.3  95584  7212 ?        Ss   01:47   0:00 sshd: tiger [priv]
root       980  0.0  0.3  95464  7088 ?        Ss   01:21   0:00 sshd: tiger [priv]
root      1044  0.0  0.3  95464  7048 ?        Ss   01:23   0:00 sshd: tiger [priv]
root       854  0.0  0.3  65612  6616 ?        Ss   01:21   0:00 /usr/sbin/sshd -D
root       592  0.0  0.3 274592  6240 ?        Ssl  01:21   0:00 /usr/lib/accountsservice/accounts-daemon
root         1  0.0  0.2  37888  5952 ?        Ss   01:21   0:02 /sbin/init noprompt
syslog     576  0.0  0.2 256396  5372 ?        Ssl  01:21   0:00 /usr/sbin/rsyslogd -n
faster    1137  0.0  0.2  21224  5272 pts/0    S    01:37   0:00 -su

该命令亦可使用ps auxw --sort=-rss|head -10命令替代。

git 关联远程仓库

当使用Git进行代码push提交时,出现报错信息“fatal: 'origin' does not appear to be a git repository...”,

$ git push -u origin master
fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.

是因为远程不存在origin这个仓库名称,可以使用如下操作方法,查看远程仓库名称以及路径相关信息,可以删除错误的远程仓库名称,重新添加新的远程仓库;

git remote -v: 查看远程仓库详细信息,可以看到仓库名称

git remote remove orign: 删除orign仓库(如果把origin拼写成orign,删除错误名称仓库)

git remote add origin 仓库地址: 重新添加远程仓库地址

gti push -u origin master: 提交到远程仓库的master主干