sftp非交互式自动上传文件

通过秘钥认证,上传文件到sftp服务器。
比如sftp登录后有4个根目录 nj on pa wv,把同一个文件传到4个目录中可以用如下命令:

echo "put /data/rsi/mi/void.2024-06-11.csv /NJ/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x
echo "put /data/rsi/mi/void.2024-06-11.csv /ON/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x
echo "put /data/rsi/mi/void.2024-06-11.csv /PA/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x
echo "put /data/rsi/mi/void.2024-06-11.csv /WV/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x

/data/rsi/mi 为本地路径
/NJ/ 为sftp中的路径
通过echo后避免了交互式,达到自动上传目的。

rsyslog通过发送者来源ip区分日志路径

[root@localhost ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

# 定义一个模版
$template IpTemplate,"/var/log/usg/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"
:fromhost-ip, !isequal, "127.0.0.1" ?IpTemplate
& ~  # &符号表示已经匹配处理的内容,~符号表示再也不进行其余处理

这样客户端发送过来的日志,rsyslog会根据源ip创建一个文件夹来保存日志。

测试:
通过logger命令测试发送日志
机器1:
logger -n 192.168.6.205 -p user.info "from server 1"

机器2:
logger -n 192.168.6.205 -p user.info "from server 2"

适合多个网络设备集中收集日志。

curl访问提示SSL certificate problem: unable to get local issuer certificate

当在php代码中请求指定接口时,提示错误

SSL certificate problem: unable to get local issuer certificate, on POST https://api.x.com/xx/xx

在系统中通过curl命令访问也是这个错误。

开始以为是本地的ca-certificates包过旧,可信根证书列表失效导致,但是更新以后还是如此。
排查发现这个问题是由于对方的ssl证书中没有包含中间证书导致的,本地系统只包含根,不带中间证书,导致验证失败。

浏览器验证ssl证书的可信性通常由 根证书-中间证书-服务器证书 组成

在证书链中,通常分为三级结构,根证书、中间证书、服务器证书(域名证书)。
在正常的证书链顺序中服务器证书处于最低端,该证书包含了服务器域名,服务器公钥和签名值等。
在其上一级则是中间证书,也就是由权威CA机构授权的二级机构,用来签发服务器证书。
最上级就是根证书,也就是CA机构,对服务器身份进行校验时,需要验证整个证书链。
由于浏览器中集成了权威CA机构的根证书,因此主要是校验中间证书和服务器证书的签名值是否正确,从而构成一条信任链。

/etc/pki/ca-trust/source/anchors/ 目录在 CentOS 系统中用于存储用户添加的信任锚点(trust anchors)证书(根证书或中间证书)。
当需要让系统信任一个额外的证书颁发机构(CA)时,可以将该 CA 的证书复制到这个目录。
然后,运行 update-ca-trust 命令来更新系统信任的证书。
这样,系统上的应用程序和服务就能够信任由这些额外 CA 签发的证书了。

中间证书一般在颁发ssl证书时会合并在一起,但不排除某些需要自己合并的场景。

# 安装中间证书

存放路径:/etc/pki/ca-trust/source/anchors/
生效:update-ca-trust

# 证书链检查网站
https://uutool.cn/ssl-check/

[root@ip-172-31-10-235 certs]# rpm -ql ca-certificates-2023.2.64-1.amzn2.0.1.noarch
/etc/pki/ca-trust
略
/etc/ssl/certs
/usr/bin/ca-legacy
/usr/bin/update-ca-trust
略
ca-certificates这个rpm包提供了update-ca-trust命令及证书路径,系统内的根证书就是由此包提供。

参考:https://www.cnblogs.com/sslwork/p/5986985.html

udev自定义设备名称

测试环境 almalinux9.3

规则配置文件必须以 .rules 为后缀名
udev按照配置文件名的字母顺序来查询全部规则文件,匹配到后会继续匹配其他规则文件。

在规则文件里,除了#开头的行,所有的非空行都为一条规则,一条规则不能扩展到多行。
规则由多个键值对组成,并由逗号隔开,键值对可以分为"条件匹配键值对"(以下简称 "匹配键" )和"赋值键值对"(以下简称 "赋值键"),一条规则可以有多条匹配键和多条赋值键。
匹配键是匹配一个设备属性的所有条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则生效,然后按照赋值键的内容,执行该规则的赋值。


匹配键:
ACTION          事件(uevent)的行为,例如:add(添加设备)、remove(删除设备),udev守护进程帧听来自内核的uevent
KERNEL          内核设备名称,例如:sda,cdrom;
DEVPATH         设备的 devpath 路径;
SUBSYSTEM       设备的子系统名称,例如:sda 的系统为 block;
BUS             设备在 devpath 里的总线名称,例如:usb;
DRIVER          设备在 devpath 的设备驱动名称,例如:ide-cdrom;
ID              设备在 devpath 里的识别号;
SYSFS{filename} 设备的 devpath 路径下,设备的属性文件 "filename" 里的内容;
ENV{key}        环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键;
PROGRAM         调用外部命令;
RESULT          外部命令 PROGRAM 的返回结果。

操作符:
==  比较键、值,若等于,则该条件满足;
!=  比较键、值,若不等于,则该条件满足;
=   对一个键赋值;
+=  为一个表示多个条目的键赋值;
:=  对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。

赋值键:
NAME     在 /dev 下产生的设备文件名。只有第一个对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件;
SYMLINK  为 /dev/ 下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
OWNER,GROUP,MODE 为设备设定权限;
ENV{key} 导入一个环境变量。



1、查看usb设备的厂商id和设备id
[root@localhost rules.d]# lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port / Mobile Action MA-8910P
Bus 001 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

ID   067b:2303
VENDOR_ID:MODEL_ID

2、根据厂商id或设备id去udev里匹配
[root@localhost rules.d]# udevadm info /dev/* | grep -C 20 2303

找到 DEVNAME|ID_VENDOR_ID|ID_MODEL_ID|SUBSYSTEM|ID_PATH 这几个字段用于配置自定义设备名称

规则配置文件路径 /etc/udev/rules.d

# 根据ID_PATH作为匹配条件
[root@localhost rules.d]# cat usb2console.rules 
SUBSYSTEM=="tty", ENV{ID_PATH}=="pci-0000:02:00.0-usb-0:2.1:1.0",SYMLINK+="usb2consoleline"

# 根据厂商设备id作为匹配条件
[root@localhost rules.d]# cat usb.rules 
SUBSYSTEM=="tty", ENV{ID_VENDOR_ID}=="239a", ENV{ID_MODEL_ID}=="80f4",SYMLINK+="usb-pi"
SUBSYSTEM=="tty", ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}=="2303",SYMLINK+="usb-consoleline"

取子系统SUBSYSTEM等于tty,且变量ID_VENDOR_ID等于xxx,且变量ID_MODEL_ID等于xxx时,设置赋值键symbol link等于xxx

重插拔usb测试,查看/dev/usb-*的自定义名称

参考:https://blog.csdn.net/u014674293/article/details/121627305

rsyslog中定义日志路径配置参数解释

在ubuntu中要看ssh登录日志会发现是没有secure日志文件的,而是auth.log文件,实际这是由于centos和ubuntu配置的日志名称不一样。
下面是两者的区别。

# ubuntu中的配置
auth,authpriv.*			/var/log/auth.log
*.*;auth,authpriv.none		-/var/log/syslog
kern.*				-/var/log/kern.log
mail.*				-/var/log/mail.log
mail.err			/var/log/mail.err
*.emerg				:omusrmsg:*

# centos中的配置
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

# 参数解释

# *.* 含义
第一个*代表所有设施代码
以下是一些常见的日志设施:
kern - 内核消息
user - 用户级别消息
mail - 邮件系统
daemon - 系统守护进程
auth - 安全/认证消息
syslog - syslogd 生成的消息
lpr - 行打印子系统
news - 网络新闻子系统
uucp - UUCP 子系统
cron - 计划任务子系统
authpriv - 安全/认证消息(私有)
ftp - FTP 守护进程

第二个*代表日志级别
在 syslog 中,每条日志消息都会根据其重要性被赋予一个优先级。这些优先级从最高到最低依次是:
emerg(紧急): 表示系统不可用的紧急情况。
alert(警报): 需要立即采取行动的情况。
crit(严重): 表示重要系统组件的严重问题。
err(错误): 非紧急的故障。
warning(警告): 警告信息,可能会导致错误。
notice(通知): 正常但值得注意的事件。
info(信息): 一般性的信息性消息。
debug(调试): 调试信息,通常只在开发时使用。

# none含义
auth.none表示不记录任何auth设施代码的日志消息。用于排除特定设施代码的日志,以避免重复记录或将其记录到不同的文件中。
例如,在配置*.*;auth,authpriv.none -/var/log/syslog中,
*.*会匹配所有消息,但是auth,authpriv.none会排除所有auth和authpriv设施的日志,这样它们就不会被记录

# , ; 逗号分号含义
逗号代表“和”的关系,比如auth,authpriv.* 就是auth和authpriv的所有级别日志
分号代表“排除”,比如*.*;auth,authpriv.none就是匹配所有设施代码的所有级别日志,但是排除auth和authpriv的所有日志

# - 减号含义
在rsyslog配置文件中,减号 - 代表使用异步方式写入日志。
这意味着日志消息会先被存储在内存中,然后在稍后的某个时间点批量写入磁盘。
这种方法可以减少磁盘I/O操作,提高性能,但如果系统突然崩溃,可能会丢失那些还没有被写入磁盘的日志消息

设施代码是在rsyslog配置中用来指定日志消息来源的标识符。这些代码帮助将日志消息分类,以便于管理和分析。
在UNIX和类UNIX系统中,日志消息被分为不同的设施,每个设施代表了系统的一个特定部分或者应用程序。
例如,kern代表内核消息,mail代表邮件系统消息,而auth代表认证系统消息。这些设施代码是根据标准和系统实现预定义的
而local0到local7是为本地使用保留的,可以由系统管理员自定义用途。