我正在寻找一个终端命令,它不需要执行用户在 sudoers 组中并且是通用的并且不需要安装额外的包。到目前为止,我发现如果系统安装了 systemd 那么我可以使用:
$ hostnamectl status
Static hostname: mint
Icon name: computer-laptop
Chassis: laptop
Machine ID: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Boot ID: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Operating System: Linux Mint LMDE
Kernel: Linux 3.16.0-6-amd64
Run Code Online (Sandbox Code Playgroud)
在图标名称和机箱下,我可以看到它是虚拟机还是物理机。但是我想知道我是否可以使用lscpu
,特别是因为它是比hostnamectl
systemd更通用的方法,并且不需要 systemd。我的理论是,如果 CPU 每个核心只有一个线程,并且没有列出最小和最大 CPU 频率,这应该表明服务器确实是虚拟化的。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Model …
Run Code Online (Sandbox Code Playgroud) 我想在 Bash 中创建一个包含所有活动网络接口的数组。
我设法创建了一个 for 循环打印它们,但是当我尝试创建数组时,它只包含最后一个lo
接口而不包含另一个接口。这是我的代码:
#!/bin/bash
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
printf "$iface%s\n"
declare -a array_test=["$iface"]
done
for i in "${array_test[@]}"; do echo "$i"; done
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
eno1
eno2
eno3
lo
[lo]
Run Code Online (Sandbox Code Playgroud)
另外,如何从数组中排除 lo localhost 接口?
我想找到某个目录中最旧文件的年龄,如果该目录中没有任何文件,则返回 0。我还需要一个单行命令来完成它。到目前为止,这是我用于查找目录中最旧文件的年龄(以秒为单位)的命令:
expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
Run Code Online (Sandbox Code Playgroud)
问题是,如果没有文件,它会返回以下错误:
$ expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
stat: cannot stat ‘0’: No such file or directory
-bash: 1554373460 - : syntax error: operand expected (error token is "- ")
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,我希望命令只返回 0 并抑制错误打印输出。
我想检查用户输入是否是 bash 中的有效 IP 地址/CIDR,并且我正在使用正则表达式来执行此操作。所以有效的 CIDR 应该是 0-32,对于 IP,(1-254).(1-255).(1-255).(1-255)/(1-32)
所以我当前的代码是:
read -p "Input: " ip_address
if [[ $ip_address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]];
then
echo "VALID"
else
echo "NOT VALID"
fi
Run Code Online (Sandbox Code Playgroud)
但它过于慷慨并且接受一些无效的组合。因此,有效的 IP 地址/CIDR 组合应该是:10.11.11.11/24
或 ,254.255.255.255/23
而无效是256.19.11.11/24
因为第一个八位字节高于 255 或222.222.222.222/33
这里的 CIDR 高于 32。 除了正则表达式之外,还有其他方法来检查有效的 IP 地址/CIDR 吗?
我的 while 循环检查中有一个错误。我正在检查用户输入是否是有效的用户界面。这是我的代码:
#!/bin/bash
net_array=()
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
net_array+=("$iface")
done
unset "net_array[${#net_array[@]}-1]"
# Network Interface selection
printf "\nPlease select the network interface you want to use:\n"
read -r user_iface
while ! [[ "${net_array[@]}" =~ $user_iface ]]; do # check if the user input is valid
echo "Please enter a valid network interface:"
read -r user_iface
done
Run Code Online (Sandbox Code Playgroud)
通常,此代码有效并检查元素是否在数组中。我的电脑有 eno1、eno2、eno3 接口,当我插入不同的东西时,比如 eno5,它再次要求我插入网络接口。
问题是,如果我只插入1
,它会接受它作为有效的网络接口,事实并非如此,我想排除它。我想我可以执行不包括所有数字用户输入的额外检查,但我想知道我的错误是什么?
我正在尝试编写一个脚本,该脚本将凭据保存到 .netrc 文件中,然后从文件中读取,以便将它们传递给 curl 命令并保存返回的 cookie 文件以备将来使用。我很感兴趣,如果这是传递用户名和密码的安全方式,并且如果我试图访问的服务器是通过 HTTP 访问的,那么如果中间有攻击者,他们是否能够嗅探凭据。
#!/bin/bash
IP="192.168.0.1"
user="Administrator"
pass="Password1234"
function credentials {
mkdir "${HOME}"/.netrc
rm "${HOME}"/.netrc/credentials.txt
touch "${HOME}"/.netrc/credentials.txt
{ echo "machine ${IP}"; echo "login ${user}"; echo "password ${pass}"; } >> "${HOME}"/.netrc/credentials.txt
chmod 600 "${HOME}"/.netrc/credentials.txt
}
function cookie {
curl -v -c cookie.txt -n "${HOME}"/.netrc/credentials.txt http://"${IP}"/setup.php
}
credentials
cookie
Run Code Online (Sandbox Code Playgroud)
我已经检查和credentials.txt文件被正确保存在相应的目录和证书具有正确的权限,但是当我尝试运行cookie的,我有以下错误:Couldn't find host 192.168.0.1 in the .netrc file; using defaults
。为什么 curl 无法从credentials.txt 文件中获取配置的用户名和密码?
bash ×4
linux ×2
shell-script ×2
.netrc ×1
command-line ×1
curl ×1
directory ×1
files ×1
ifconfig ×1
ip ×1
networking ×1
security ×1