我正在尝试比较两个 debian 11 系统(服务器 1 和服务器 2)、一个 debian 9 和一个 11 系统(服务器 3 和服务器 2),并确保它们具有相同的软件包。我打算使用 ansible 安装缺少的软件包。
我查看了Debian 在哪里存储已安装软件包的列表?但它不显示 apt 包版本,也显示依赖项。我只需要安装在 system1 上的带有版本号的 debian 软件包,这样我就可以在 system2 上进行比较并安装缺少的软件包。
我正在尝试比较两个 debian 11 系统(服务器 1 和服务器 2)、一个 debian 9 和一个 11 系统(服务器 3 和服务器 2),并确保它们具有相同的软件包。我打算使用 ansible 安装缺少的软件包。
我查看了Debian 在哪里存储已安装软件包的列表?但它不显示 apt 包版本,也显示依赖项。我只需要安装在 system1 上的带有版本号的 debian 软件包,这样我就可以在 system2 上进行比较并安装缺少的软件包。
如何将正在运行的 Linux 文件系统 (Debian 10) 克隆到.img
文件中?我想将其闪存到另一个 SSD 并希望新系统运行完全相同。Clonezilla 对我不起作用。新机器硬件将完全相同。
我正在尝试10.AB.C9
从 5 位数字构建三个八位字节12ABC
:
12
= 第一个八位字节AB
= 第二个八位字节C
= 第三个八位字节我现有的代码有两种情况会导致生成正确的 IP。如果 C 有一个前导零,例如:02,那么第三个八位字节将为 027,并且 IP 不能有硬编码的前导零。
five_digits=12620
if [ "${five_digits:4:1}" -eq 0 ]; then
ip_main="10.${five_digits:2:2}.9"
gateway_ip_prefix="10.${five_digits:2:2}.2"
elif [ "${five_digits:4:1}" -ne 0 ]; then
ip_main="10.${five_digits:2:2}.${five_digits:4:1}9"
gateway_ip_prefix="10.${five_digits:2:2}.${five_digits:4:1}2"
上面的代码解决了 C 中的前导零问题
第二种情况是 A 为零,这意味着第二个八位字节将具有前导零。我不确定如何处理这种情况并希望使脚本更简单。
如何在中间的 OpenVPN 服务器提供的同一虚拟子网上的一个 OpenVPN 客户端和另一个客户端之间编写回显语句?就像我想从客户端回显一个字符串,而另一个客户端应该用一个字符串回复?
我正在尝试转换10.AB.C9.XYZ
为10.AB.C2.252
.
现在我正在提取每个字符并将它们拼凑在一起。
ip_main=10.AB.C9.XYZ
A_char=${ip_main:3:1}
B_char=${ip_main:4:1}
C_char=${ip_main:6:1}
new_ip="10.${A_char}${B_char}.${C_char}2.252"
有没有更好的方法来实现这一点?
#!/bin/bash
if [ $# -gt 0 ]; then
snum=( $@ )
echo $snum
fi
./testscript.sh 1234 4568
当我像The output of echo command is only那样运行脚本时1234
,所以我想我没有构建所有位置参数的数组?
#!/bin/bash
if [ $# -gt 0 ]; then
snum="$@"
echo $snum
fi
并运行./testscript.sh 1234 4568
输出是1234 4568
我想知道为什么snum=( $@ )
只采用第一个位置参数?
我有一个脚本,它的函数来源于其他脚本。我正在尝试逐行但 sed 正则表达式太复杂了。
#!/usr/bin/env bash
# This function will update the value associated with a key,
# remove a comment from the beginning of the line,
# or append the key value pair to the end of the file if the key is not found
# To use this function in a script
# source this script:
# . lineinfile
#
# To invoke the function:
# lineinfile "key=value" "filename"
# OR
# lineinfile "key value" "filename"
lineinfile() {
[ -s $2 ] || echo "${1}" >> ${2}
if [[ "$1" == *"="* ]]; then
sed -i -e "/^#\?.*\(${1%%=*}\).*/{s@@${1}@;:a;n;ba;q}" -e "\$a${1}" ${2}
elif [[ "$1" == *" "* ]]; then
sed -i -e "/^#\?.*\(${1%% *}\).*/{s@@${1}@;:a;n;ba;q}" -e "\$a${1}" ${2}
elif [[ "$1" == *$'\t\t'* ]]; then
sed -i -e "/^#\?.*\(${1%%$'\t\t'*}\).*/{s@@${1}@;:a;n;ba;q}" -e "\$a${1}" ${2}
fi
}
函数的第一行[ -s $2 ] || echo "${1}" >> ${2}
- 检查第二个位置参数是否是一个存在且大小非零的文件,然后将内容附加$1
到$2
文件末尾。为什么||
在这里使用?
我真的不确定 if-elif 块正在测试什么。在 if 条件中是什么*"="*
*" "*
并*$'\t\t'*
试图匹配?此外,我不知道 sed 命令在做什么。正则表达式很复杂。任何人都可以为我分解 sed 命令。
ipfile.txt
格式如下:
ServerA 127.0.0.1
ServerB 192.168.1.254
ServerC 4.2.2.1
shell脚本的期望输出:
ServerA Class A
ServerB Class C
ServerC Class A
我想不出更好的方法来只提取第一个八位字节。到目前为止,我的脚本是:
#!/bin/bash
# Take input IP from file and classify according to classful addressing.
while read ip;do
octet=$(awk -F'[ .]' '{print $2}' ipfile.txt)
if [[ "$octet" -ge 1 && "$octet" -le 127 ]];then
echo "ServerA Class A"
fi
if [[ "$octet" -ge 128 && "$octet" -le 191 ]];then
echo "ServerB Class B"
fi
if [[ "$octet" -ge 192 && "$octet" -le 223 ]];then
echo "ServerC Class C"
fi
done < ipfile.txt
我收到语法错误:
./ipclassgen.sh: line 7: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 10: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 13: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 7: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 10: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 13: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 7: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 10: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 13: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 7: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 10: [[: 127
192
4: syntax error in expression (error token is "192
4")
./ipclassgen.sh: line 13: [[: 127
192
4: syntax error in expression (error token is "192
4")
如何在不使用 awk 和指定文件的情况下做到这一点。我也不确定语法错误在哪里。
仅 ping 命令的输出:
[root@servera ~]# ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=8.04 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=7.47 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=7.72 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=7.50 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 7.473/7.683/8.037/0.225 ms
我只想从“收到的 4”中捕获整数 4。
ping -c 4 8.8.8.8 | awk -F ',' '/received/ { print $2 }'
结果是 4 received
。我只想从上面的命令中捕获数字 4。我怎样才能做到这一点?分隔符现在是空格。
在 RHEL8 上,我用 ext4 文件系统创建了一个 lvm。将其添加到/etc/fstab
但当我使用时mount -av
,我收到以下错误:
You just mounted an file system that supports labels which does not
contain labels, onto an SELinux box. It is likely that confined
applications will generate AVC messages and not be allowed access to
this file system. For more details see restorecon(8) and mount(8).
/lvext4 : successfully mounted
如果我在里面创建一个文件/lvext4
,它的 SELinux 上下文是unconfined_u:object_r:unlabeled_t:s0 file1
挂载 XFS lvm 时出现同样的错误。
我删除了一个没有数据格式化的逻辑卷ext4
。然后我开始创建一个swap
LVM,但它警告我存在ext4
签名。我假设该lvremove
命令不会删除 fs 签名。提示使用时删除签名是否安全lvcreate
?
[root@workstation ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home cl -wi-ao---- <6.52g
root cl -wi-ao---- 19.00g
swap cl -wi-ao---- 2.00g
lv01 vg01 -wi-a----- 404.00m
lv02 vg01 -wi-a----- 100.00m
[root@workstation ~]# lvremove /dev/vg01/lv02
Do you really want to remove active logical volume vg01/lv02? [y/n]: y
Logical volume "lv02" successfully removed.
[root@workstation ~]#
[root@workstation ~]#
[root@workstation ~]# lvcreate -n swap1 -L 100M vg01
WARNING: ext4 signature detected on /dev/vg01/swap1 at offset 1080. Wipe it? [y/n]:
使用 CentOS 8.5
我在没有数据或分区表的新磁盘上尝试了这个。
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-4194270, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-4194270, default = 4194270) or {+-}size{KMGTP}: +500M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/nvme0n7.
The operation has completed successfully.
[root@workstation ~]#
[root@workstation ~]# lsblk -fp
NAME FSTYPE LABEL UUID MOUNTPOINT
/dev/sr0
/dev/nvme0n1
├─/dev/nvme0n1p1 xfs c932c155-e3a9-4852-aad1-d545778b46c6 /boot
└─/dev/nvme0n1p2 LVM2_member KwN1Pf-Jf3R-l7HW-Qed3-DLSl-olMr-rVdD3n
├─/dev/mapper/cl-root xfs e6d63656-cd58-40a8-aadf-b0416e36c8d4 /
├─/dev/mapper/cl-swap swap 3b26e208-9846-4c20-8b90-60bb0ce68869 [SWAP]
└─/dev/mapper/cl-home xfs 7cb2b8a0-fe6b-4c6c-9d8f-124780be79c9 /home
/dev/nvme0n2
/dev/nvme0n3
/dev/nvme0n4
/dev/nvme0n5
/dev/nvme0n6
/dev/nvme0n7
└─/dev/nvme0n7p1 xfs 25552944-4b61-44d6-a1bd-ca0ae3cfc89f
/dev/nvme0n8
/dev/nvme0n9
[root@workstation ~]#
如您所见,分区上已经创建了 xfs 文件系统。我以为我必须在使用mkfs.xfs
后使用fdisk
or gdisk
。
yum group info <name of group>
列出强制、默认和可选包。然而,当尝试使用 安装组时yum group install <group>
,它只安装强制和默认包。如何安装可选包?
root
我可以使用以下权限将拥有的 /etc/passwd 文件复制到我的主目录:
-rw-r--r--. 1 root root 2751 Dec 24 21:26 /etc/passwd
我不能这样做:
-rw-------. 1 root root 43591 Dec 27 18:32 /var/log/messages
所以我猜测读取权限others
使复制成为可能?
为了制作硬链接,我在我的主目录中将 file1 创建为 root 用户,并尝试以普通用户的身份创建硬链接。我没能。
-rw-r--r--. 1 root root 0 Dec 27 18:39 file1
是什么阻止了硬链接的创建?
file1所在的目录权限为:
drwx------. 18 student student 4096 Dec 27 18:42 .
我可以将file1重命名为file2,所以我猜,与复制一样,读取权限others
是否会发生这种情况?
最后,我无法将 file2 移动到其他位置。为什么?
编辑:我看过一个解释硬链接权限的问题,但我不明白复制、移动和重命名其他用户的文件和目录需要什么权限。
这是 Linux Command Line 一书中的一个示例
如果我尝试匹配 (555) 123-4567 或 555 123-4567 - 可以使用以下扩展正则表达式。
^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
简化为
^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$
在第一个示例中,第二个示例是否?
适用于包含在 ? 中的整个表达式()
?这意味着它将匹配555
或(555)
。
在第二个例子中:
echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
*
星号适用于整个表达式还是仅适用于包含大写和小写字符类的表达式的第二部分?
如果前面的表达式是这样的:
grep -E '[[:upper:][:upper:]][:lower:]*\.'
*
仅适用于较低的字符类吗?