运维相关日志
8月21
错误原因和现象
在执行shell脚本的时候,报错:/bin/bash^M: bad interpreter: No such file or directory。
是由于该脚本文件是在Windows平台编写,然后在MacOS或者Kylin-Server平台中执行。
在Windows平台上文件是dos格式,换行符尾\r\n,而MacOS或者Kylin-Server平台文件是unix格式,换行符尾\n。因此在运行脚本文件时,不能正确解析\r,导致编译错误、运行失败。
解决方案
在MacOS或者Kylin-Server平台上,打开命令行工具执行命令vim *.sh(编辑你的脚本文件),然后执行命令:set ff=unix,最后执行:wq( 保存退出)即可。
在执行shell脚本的时候,报错:/bin/bash^M: bad interpreter: No such file or directory。
是由于该脚本文件是在Windows平台编写,然后在MacOS或者Kylin-Server平台中执行。
在Windows平台上文件是dos格式,换行符尾\r\n,而MacOS或者Kylin-Server平台文件是unix格式,换行符尾\n。因此在运行脚本文件时,不能正确解析\r,导致编译错误、运行失败。
解决方案
在MacOS或者Kylin-Server平台上,打开命令行工具执行命令vim *.sh(编辑你的脚本文件),然后执行命令:set ff=unix,最后执行:wq( 保存退出)即可。
6月29
linux同步时间命令:
1、hwclock命令,可以让系统时间和硬件时间的同步,例“hwclock -w”或“hwclock -s”;
2、ntpdate命令,可以让不同机器间同步时间。
在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间,以保证时间的不间断。
但在Linux下,默认情况下,系统时间和硬件时间并不会自动同步。在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠BIOS电池来维持,而系统时间,是用CPU Tick来维持的。在系统开机的时候,会自动从BIOS中取得硬件时间,设置为系统时间。
1. Linux系统时间的设置
在Linux中设置系统时间,可以用date命令:
//查看时间
[root@node1 ~]# date
Tue Feb 25 20:15:18 CST 2014
//修改时间
[root@node1 ~]# date -s "20140225 20:16:00" #yyyymmdd hh:mm:ss
Tue Feb 25 20:16:00 CST 2014
//date 有多种时间格式可接受,查看date --help
2. Linux硬件时间的设置
硬件时间的设置,可以用hwclock或者clock命令。两者基本相同,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。
//查看硬件时间可以是用hwclock ,hwclock --show 或者 hwclock -r
[root@node1 ~]# hwclock --show
Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds
//设置硬件时间
[root@node1 ~]# hwclock --set --date "20140225 20:23:00"
[root@node1 ~]# hwclock
Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds
3. 系统时间和硬件时间的同步
同步系统时间和硬件时间,可以使用hwclock命令。
//以系统时间为基准,修改硬件时间
[root@node1 ~]# hwclock --systohc <== sys(系统时间)to(写到)hc(Hard Clock)
//或者
[root@node1 ~]# hwclock -w
//以硬件时间为基准,修改系统时间
[root@node1 ~]# hwclock --hctosys
//或者
[root@node1 ~]# hwclock -s
1、hwclock命令,可以让系统时间和硬件时间的同步,例“hwclock -w”或“hwclock -s”;
2、ntpdate命令,可以让不同机器间同步时间。
在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间,以保证时间的不间断。
但在Linux下,默认情况下,系统时间和硬件时间并不会自动同步。在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠BIOS电池来维持,而系统时间,是用CPU Tick来维持的。在系统开机的时候,会自动从BIOS中取得硬件时间,设置为系统时间。
1. Linux系统时间的设置
在Linux中设置系统时间,可以用date命令:
//查看时间
[root@node1 ~]# date
Tue Feb 25 20:15:18 CST 2014
//修改时间
[root@node1 ~]# date -s "20140225 20:16:00" #yyyymmdd hh:mm:ss
Tue Feb 25 20:16:00 CST 2014
//date 有多种时间格式可接受,查看date --help
2. Linux硬件时间的设置
硬件时间的设置,可以用hwclock或者clock命令。两者基本相同,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。
//查看硬件时间可以是用hwclock ,hwclock --show 或者 hwclock -r
[root@node1 ~]# hwclock --show
Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds
//设置硬件时间
[root@node1 ~]# hwclock --set --date "20140225 20:23:00"
[root@node1 ~]# hwclock
Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds
3. 系统时间和硬件时间的同步
同步系统时间和硬件时间,可以使用hwclock命令。
//以系统时间为基准,修改硬件时间
[root@node1 ~]# hwclock --systohc <== sys(系统时间)to(写到)hc(Hard Clock)
//或者
[root@node1 ~]# hwclock -w
//以硬件时间为基准,修改系统时间
[root@node1 ~]# hwclock --hctosys
//或者
[root@node1 ~]# hwclock -s
1月12
MinIO 服务器配置文件(config.json)存储在 --config-dir 指定的配置目录中,--config-dir 默认值为 ${HOME}/.minio(笔者的目录为 C:\Users\Administrator\.minio)。
但是从 RELEASE.2018-08-18T03-49-57Z 之后的版本开始,配置文件已迁移到存储数据的 .minio.sys/config 目录(存储后端是启动服务器时传递给 MinIO 服务器的目录)。如果使用如下命令启动 MinIO 服务:
minio.exe server D:/tmp/data
则配置文件位于 D:\tmp\data\.minio.sys\config 目录中。
注意:你可以使用 mc -h 命令查看当前 MinIO 的版本信息,如下:
D:\server\minio>mc -h
NAME:
mc - MinIO Client for cloud storage and filesystems.
...
VERSION:
RELEASE.2021-06-13T17-48-22Z
您可以使用 --config-dir 指定现有配置的位置,MinIO 会自动将 config.json 迁移到您的后端存储。您当前 --config-dir 指定的 config.json 配置文件将在成功迁移后重命名为 config.json.deprecated。
如果你的配置文件位于 C:\Users\Administrator\.minio\config.json,MinIO 会自动将 config.json 中的配置迁移到 D:\tmp\data\.minio.sys\config\config.json 文件,然后将 C:\Users\Administrator\.minio\config.json 重命名为 C:\Users\Administrator\.minio\config.json.deprecated。
此外 --config-dir 现在是一个遗留选项,计划在将来删除,因此请相应地更新您的本地启动和 ansible 脚本。使用如下命令去启动 MinIO 服务:
minio.exe server D:\tmp\data
上面命令,将创建的存储桶以及存储桶中的对象放到 D:\tmp\data 目录,并且配置信息均位于 D:\tmp\data\.minio.sys 目录。
但是从 RELEASE.2018-08-18T03-49-57Z 之后的版本开始,配置文件已迁移到存储数据的 .minio.sys/config 目录(存储后端是启动服务器时传递给 MinIO 服务器的目录)。如果使用如下命令启动 MinIO 服务:
minio.exe server D:/tmp/data
则配置文件位于 D:\tmp\data\.minio.sys\config 目录中。
注意:你可以使用 mc -h 命令查看当前 MinIO 的版本信息,如下:
D:\server\minio>mc -h
NAME:
mc - MinIO Client for cloud storage and filesystems.
...
VERSION:
RELEASE.2021-06-13T17-48-22Z
您可以使用 --config-dir 指定现有配置的位置,MinIO 会自动将 config.json 迁移到您的后端存储。您当前 --config-dir 指定的 config.json 配置文件将在成功迁移后重命名为 config.json.deprecated。
如果你的配置文件位于 C:\Users\Administrator\.minio\config.json,MinIO 会自动将 config.json 中的配置迁移到 D:\tmp\data\.minio.sys\config\config.json 文件,然后将 C:\Users\Administrator\.minio\config.json 重命名为 C:\Users\Administrator\.minio\config.json.deprecated。
此外 --config-dir 现在是一个遗留选项,计划在将来删除,因此请相应地更新您的本地启动和 ansible 脚本。使用如下命令去启动 MinIO 服务:
minio.exe server D:\tmp\data
上面命令,将创建的存储桶以及存储桶中的对象放到 D:\tmp\data 目录,并且配置信息均位于 D:\tmp\data\.minio.sys 目录。
1月12
第一步,进入/opt 目录,创建minio文件夹
cd /opt
mkdir minio
第二步,wget下载安装包:
https://dl.minio.io/server/minio/release/linux-amd64/minio
第三步,进入minio文件夹创建log文件
cd /minio
touch minio.log
第四步,赋予minio文件执行权限
chmod 777 minio
第五步,启动minio
./minio server /opt/minio/data (/opt/minio/data 为你存放静态文件的目录)
这个时候我们看下面爆红的提示,说的是:
警告:控制台端点正在侦听动态端口 (39175),请使用 --console-address “:PORT” 选择静态端口。
警告:检测到默认凭据“minioadmin:minioadmin”,我们建议您使用“MINIO_ROOT_USER”和“MINIO_ROOT_PASSWORD”环境变量更改这些值
所以我们按照提示来:
export MINIO_ROOT_USER=fileadmin
export MINIO_ROOT_PASSWORD=fileadmin
第六步,重新启动minio
./minio server /opt/minio/data (/opt/minio/data 为你存放静态文件的目录)
第七步,设置环境变量
vim /etc/profile
添加
# set minio environment
export MINIO_ROOT_USER=fileadmin
export MINIO_ROOT_PASSWORD=fileadmin
生效:source /etc/profile;
第 七步,设置minio后台启动(指定端口)
vim start.sh
nohup /opt/minio/minio server /opt/minio/data --console-address ":35555" > /opt/minio/minio.log 2>&1 &
('2>&1’表示现在标准输出直接输入到/opt/minio/minio.log 中,而2>&1是将标准错误重定向到标准输出,‘nohup’和末尾’&'组合使用表示脱离终端后继续执行)
cd /opt
mkdir minio
第二步,wget下载安装包:
https://dl.minio.io/server/minio/release/linux-amd64/minio
第三步,进入minio文件夹创建log文件
cd /minio
touch minio.log
第四步,赋予minio文件执行权限
chmod 777 minio
第五步,启动minio
./minio server /opt/minio/data (/opt/minio/data 为你存放静态文件的目录)
这个时候我们看下面爆红的提示,说的是:
警告:控制台端点正在侦听动态端口 (39175),请使用 --console-address “:PORT” 选择静态端口。
警告:检测到默认凭据“minioadmin:minioadmin”,我们建议您使用“MINIO_ROOT_USER”和“MINIO_ROOT_PASSWORD”环境变量更改这些值
所以我们按照提示来:
export MINIO_ROOT_USER=fileadmin
export MINIO_ROOT_PASSWORD=fileadmin
第六步,重新启动minio
./minio server /opt/minio/data (/opt/minio/data 为你存放静态文件的目录)
第七步,设置环境变量
vim /etc/profile
添加
# set minio environment
export MINIO_ROOT_USER=fileadmin
export MINIO_ROOT_PASSWORD=fileadmin
生效:source /etc/profile;
第 七步,设置minio后台启动(指定端口)
vim start.sh
nohup /opt/minio/minio server /opt/minio/data --console-address ":35555" > /opt/minio/minio.log 2>&1 &
('2>&1’表示现在标准输出直接输入到/opt/minio/minio.log 中,而2>&1是将标准错误重定向到标准输出,‘nohup’和末尾’&'组合使用表示脱离终端后继续执行)
12月12
让bat批处理以管理员权限运行的实现方法
有的电脑是非管理员登录,运行程序时,需要提示是否运行运行。解决方法如下:
在批处理开头加上:
适用于无参数
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
适用于有参数
%2 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" "^&chr(34)^&"%~1"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
更多参数的以此类推
运行批处理时多加一个参数::,这句就不会执行
为了兼容8.3短路径,可把%~0等换成%~s0等
理论上是没问题,但启动路径有时不可靠,之后可能还要pushd或cd /d
bat文件以管理员权限运行的几种方式
1、创建bat快捷方式,然后右键快捷方式-->properties-->advanced-->Run as administrator。
2、下载bat转成exe工具,将bat转成exe,然后右键exe-->properties-->Compatibility-->Run as administrator。
3、以管理员权限运行cmd,然后dos框中运行相应的bat。
有的电脑是非管理员登录,运行程序时,需要提示是否运行运行。解决方法如下:
在批处理开头加上:
适用于无参数
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
适用于有参数
%2 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" "^&chr(34)^&"%~1"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
更多参数的以此类推
运行批处理时多加一个参数::,这句就不会执行
为了兼容8.3短路径,可把%~0等换成%~s0等
理论上是没问题,但启动路径有时不可靠,之后可能还要pushd或cd /d
bat文件以管理员权限运行的几种方式
1、创建bat快捷方式,然后右键快捷方式-->properties-->advanced-->Run as administrator。
2、下载bat转成exe工具,将bat转成exe,然后右键exe-->properties-->Compatibility-->Run as administrator。
3、以管理员权限运行cmd,然后dos框中运行相应的bat。
12月9
想更改hosts文件添加域名与地址ip、由于hosts文件受保护并且是只读属性。因此需要先赋予权限,并取消只读属性才能正常写入
/E 编辑 ACL 而不替换。
/G 赋予指定用户访问权限。
F 完全权限。
Administrators、SYSTEM、Users(是windows用户组需要什么加什么)
attrib 是控制文件属性的
+ 添加文件属性
- 删除文件属性
R 只读文件属性
A 存档文件属性
S 系统文件属性
H 隐藏文件属性
I 无连接属性
@echo
@echo 127.0.0.1 .heckjj.com >>E:hosts(这是我们要写入的内容)
虽然脚本比较笨拙,但是亲测有效,若是找不到好的方法可以选择试一下O(∩_∩)O
======================================================================================
1、新建记事本输入一下内容
bat脚本代码如下:
set HOSTS=C:\Windows\System32\drivers\etc\hosts
echo Y|cacls %HOSTS% /E /G Administrators:F
echo Y|cacls %HOSTS% /E /G SYSTEM:F
echo Y|cacls %HOSTS% /E /G Users:F
attrib -r -h %HOSTS%
@echo
@echo.>>%HOSTS%
@echo 127.0.0.1 heckjj.com >>%HOSTS%
attrib +r +h %HOSTS%
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,1秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 1 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 2 127.0.0.1>nul
echo.
exit
2、将记事本后缀名改为.bat格式的文件,然后双击即可完成修改。
/E 编辑 ACL 而不替换。
/G 赋予指定用户访问权限。
F 完全权限。
Administrators、SYSTEM、Users(是windows用户组需要什么加什么)
attrib 是控制文件属性的
+ 添加文件属性
- 删除文件属性
R 只读文件属性
A 存档文件属性
S 系统文件属性
H 隐藏文件属性
I 无连接属性
@echo
@echo 127.0.0.1 .heckjj.com >>E:hosts(这是我们要写入的内容)
虽然脚本比较笨拙,但是亲测有效,若是找不到好的方法可以选择试一下O(∩_∩)O
======================================================================================
1、新建记事本输入一下内容
bat脚本代码如下:
set HOSTS=C:\Windows\System32\drivers\etc\hosts
echo Y|cacls %HOSTS% /E /G Administrators:F
echo Y|cacls %HOSTS% /E /G SYSTEM:F
echo Y|cacls %HOSTS% /E /G Users:F
attrib -r -h %HOSTS%
@echo
@echo.>>%HOSTS%
@echo 127.0.0.1 heckjj.com >>%HOSTS%
attrib +r +h %HOSTS%
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,1秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 1 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 2 127.0.0.1>nul
echo.
exit
2、将记事本后缀名改为.bat格式的文件,然后双击即可完成修改。
12月5
公司有个项目需要对本地hosts文件进行修改,添加一条本地域名解析记录,如果让客户去操作,很容易破坏掉原先的hosts文件,最好是能封装成一个批处理脚本,用户只需要以管理员权限运行即可,如果记录存在则替换掉。
:: 关闭命令的回显
@echo off
:: 使用前请修改域名地址和ip地址
:: 域名地址
set url=heckjj.com
:: ip地址
set ip=192.168.1.1
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 9:12:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set ip_domain=%ip% %url%
set tmpdir=%userprofile%\AppData\Local\Temp
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%"
if %errorlevel% == 0 (
findstr /vi "%ip_domain%" %HOSTS% > %tmpdir%\hosts.tmp
type %tmpdir%\hosts.tmp > %HOSTS%
del /F /A /Q %tmpdir%\hosts.tmp
echo %ip_domain% 更新成功!
) else (
echo %ip_domain% 添加成功!
)
echo.>>%HOSTS%
echo %ip_domain% >> %HOSTS%
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,1秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 1 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 2 127.0.0.1>nul
echo.
exit
:: 关闭命令的回显
@echo off
:: 使用前请修改域名地址和ip地址
:: 域名地址
set url=heckjj.com
:: ip地址
set ip=192.168.1.1
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 9:12:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set ip_domain=%ip% %url%
set tmpdir=%userprofile%\AppData\Local\Temp
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%"
if %errorlevel% == 0 (
findstr /vi "%ip_domain%" %HOSTS% > %tmpdir%\hosts.tmp
type %tmpdir%\hosts.tmp > %HOSTS%
del /F /A /Q %tmpdir%\hosts.tmp
echo %ip_domain% 更新成功!
) else (
echo %ip_domain% 添加成功!
)
echo.>>%HOSTS%
echo %ip_domain% >> %HOSTS%
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,1秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 1 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 2 127.0.0.1>nul
echo.
exit
12月4
#使用前请修改域名地址和ip地址
#域名地址
$url="heckjj.com"
#ip地址
$ip="127.0.0.1"
$hosts="$env:windir\System32\drivers\etc\hosts"
$content=Get-Content $hosts
if( ($content |?{$_ -imatch "\s$url"}) -eq $null){
Write-Host "Adding `'$ip` to `'$url`'"
"`n$ip $url" | Out-File -FilePath $hosts -Append -encoding ascii
Write-Host "Added success!"
}else{
$content=Get-Content $hosts | Where{$_.Indexof("$url") -eq -1}
Write-Host "update `'$ip` to `'$url`'"
$content+="$ip $url"
$content | Set-Content $hosts -Force
Write-Host "updated success!"
}
最终效果,第一次是增加,后面一直是替换原来的host记录,实际上是生写了,最开始的思路是找到域名所在的行删除该行,但发现行不通,根本没有获取域名所在行的方法,最后想着是通过获取文件内容时先过滤掉当前域名的记录,也就是只读取不包含该域名host记录的行,最后再追加就可以了。
#域名地址
$url="heckjj.com"
#ip地址
$ip="127.0.0.1"
$hosts="$env:windir\System32\drivers\etc\hosts"
$content=Get-Content $hosts
if( ($content |?{$_ -imatch "\s$url"}) -eq $null){
Write-Host "Adding `'$ip` to `'$url`'"
"`n$ip $url" | Out-File -FilePath $hosts -Append -encoding ascii
Write-Host "Added success!"
}else{
$content=Get-Content $hosts | Where{$_.Indexof("$url") -eq -1}
Write-Host "update `'$ip` to `'$url`'"
$content+="$ip $url"
$content | Set-Content $hosts -Force
Write-Host "updated success!"
}
最终效果,第一次是增加,后面一直是替换原来的host记录,实际上是生写了,最开始的思路是找到域名所在的行删除该行,但发现行不通,根本没有获取域名所在行的方法,最后想着是通过获取文件内容时先过滤掉当前域名的记录,也就是只读取不包含该域名host记录的行,最后再追加就可以了。
12月4
最近公司有个项目需要对本地hosts文件进行修改,添加一条本地域名解析记录,如果让客户去操作,很容易破坏掉原先的hosts文件,最好是能封装成一个批处理脚本,用户只需要以管理员权限运行,然后根据菜单选择需要执行的功能即可。
1 批处理脚本
:: 关闭命令的回显
@echo off
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 14:45:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
GOTO MENU
:MENU
ECHO.
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.# 1.添加域名解析
ECHO.#
ECHO.# 2.编辑hosts文件
ECHO.#
ECHO.# 3.备份hosts文件
ECHO.#
ECHO.# 4.还原hosts文件
ECHO.#
ECHO.# 5.刷新dns缓存并退出
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set /p="请输入您要操作的序号:"<nul
@set /p sel=
if "%sel%"=="1" goto add_ipdomain
if "%sel%"=="2" goto edit_hosts
if "%sel%"=="3" goto backup_hosts
if "%sel%"=="4" goto reset_hosts
if "%sel%"=="5" goto refresh_dns
PAUSE
:add_ipdomain
set /p="请输入IP地址和域名(中间以空格分隔):"<nul
@set /p ip_domain=
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%\>"
if %errorlevel% == 0 (
echo %ip_domain% 已存在,请重新添加!&& goto MENU
) else (
echo.%ip_domain% >> %HOSTS% && echo %ip_domain% 添加成功,请按任意键返回菜单!&& pause >nul
)
goto MENU
:edit_hosts
title 编辑hosts本地域名解析文件
notepad %HOSTS%
echo 按任意键返回菜单!
pause >nul
goto MENU
:backup_hosts
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
pause >nul
goto MENU
pause
:reset_hosts
title 还原hosts文件
copy /y %HOSTS%.init %HOSTS%
echo hosts文件已还原至初始状态,按任意键返回菜单!
pause >nul
goto MENU
:refresh_dns
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,5秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 5 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 3 127.0.0.1>nul
echo.
exit
2 使用方法
2.1 功能菜单
第一次以管理员权限运行脚本会备份一份hosts.init文件,作为hosts初始文件,方便以后还原。
2.2 添加域名解析
添加域名解析这里采用的是手动输入 IP 地址 + 域名,并且会检索hosts文件里是否已经存在对应的 IP 地址和域名,如果存在,则提示用户重新添加。
2.3 编辑 hosts 文件
这里其实就是调用记事本来打开hosts文件。
2.4 备份 hosts文件
这里的备份文件是以hosts.日期时间的文件名格式来备份的。
2.5 还原 hosts文件
还原其实就是将 hosts.init 去掉后缀名,替换掉原先的 hosts 文件。
2.6 刷新 dns 缓存并退出
在刷新 dns 前,会先将 hosts 文件中的内容打印一下,然后执行刷新 dns 命令后退出脚本。
1 批处理脚本
:: 关闭命令的回显
@echo off
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 14:45:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
GOTO MENU
:MENU
ECHO.
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.# 1.添加域名解析
ECHO.#
ECHO.# 2.编辑hosts文件
ECHO.#
ECHO.# 3.备份hosts文件
ECHO.#
ECHO.# 4.还原hosts文件
ECHO.#
ECHO.# 5.刷新dns缓存并退出
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set /p="请输入您要操作的序号:"<nul
@set /p sel=
if "%sel%"=="1" goto add_ipdomain
if "%sel%"=="2" goto edit_hosts
if "%sel%"=="3" goto backup_hosts
if "%sel%"=="4" goto reset_hosts
if "%sel%"=="5" goto refresh_dns
PAUSE
:add_ipdomain
set /p="请输入IP地址和域名(中间以空格分隔):"<nul
@set /p ip_domain=
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%\>"
if %errorlevel% == 0 (
echo %ip_domain% 已存在,请重新添加!&& goto MENU
) else (
echo.%ip_domain% >> %HOSTS% && echo %ip_domain% 添加成功,请按任意键返回菜单!&& pause >nul
)
goto MENU
:edit_hosts
title 编辑hosts本地域名解析文件
notepad %HOSTS%
echo 按任意键返回菜单!
pause >nul
goto MENU
:backup_hosts
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
pause >nul
goto MENU
pause
:reset_hosts
title 还原hosts文件
copy /y %HOSTS%.init %HOSTS%
echo hosts文件已还原至初始状态,按任意键返回菜单!
pause >nul
goto MENU
:refresh_dns
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,5秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 5 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 3 127.0.0.1>nul
echo.
exit
2 使用方法
2.1 功能菜单
第一次以管理员权限运行脚本会备份一份hosts.init文件,作为hosts初始文件,方便以后还原。
2.2 添加域名解析
添加域名解析这里采用的是手动输入 IP 地址 + 域名,并且会检索hosts文件里是否已经存在对应的 IP 地址和域名,如果存在,则提示用户重新添加。
2.3 编辑 hosts 文件
这里其实就是调用记事本来打开hosts文件。
2.4 备份 hosts文件
这里的备份文件是以hosts.日期时间的文件名格式来备份的。
2.5 还原 hosts文件
还原其实就是将 hosts.init 去掉后缀名,替换掉原先的 hosts 文件。
2.6 刷新 dns 缓存并退出
在刷新 dns 前,会先将 hosts 文件中的内容打印一下,然后执行刷新 dns 命令后退出脚本。
10月13
我的服务器配置:linux+tomcat
出现现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常。
原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。
解决方案1:及时断开socket
protocol="org.apache.coyote.http11.Http11NioProtocol"
解决方案2:修改tomcat配置文件,修改最大连接数(增大)
修改server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" acceptCount="500" maxThreads="400" />
解决方案3:修改linux的TCP超时时间(socket生命周期)限制
vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测间隔秒数
net.ipv4.tcp_keepalive_intvl=2
编辑完 /etc/sysctl.conf,要重启network 才会生效
[root@temp /]# /etc/rc.d/init.d/network restart
出现现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常。
原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。
解决方案1:及时断开socket
protocol="org.apache.coyote.http11.Http11NioProtocol"
解决方案2:修改tomcat配置文件,修改最大连接数(增大)
修改server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" acceptCount="500" maxThreads="400" />
解决方案3:修改linux的TCP超时时间(socket生命周期)限制
vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测间隔秒数
net.ipv4.tcp_keepalive_intvl=2
编辑完 /etc/sysctl.conf,要重启network 才会生效
[root@temp /]# /etc/rc.d/init.d/network restart