小编Geo*_*nov的帖子

用于确定服务器是虚拟服务器还是物理服务器的终端命令

我正在寻找一个终端命令,它不需要执行用户在 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,特别是因为它是比hostnamectlsystemd更通用的方法,并且不需要 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)

command-line virtual-machine

15
推荐指数
2
解决办法
2万
查看次数

在 bash 中创建一个包含所有网络接口的数组

我想在 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 接口?

linux networking bash ifconfig

9
推荐指数
2
解决办法
7218
查看次数

在一行中查找最旧文件的年龄或返回零

我想找到某个目录中最旧文件的年龄,如果该目录中没有任何文件,则返回 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 并抑制错误打印输出。

directory shell-script files

4
推荐指数
1
解决办法
793
查看次数

bash 中 IP 地址/CIDR 的正则表达式

我想检查用户输入是否是 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 吗?

bash ip regular-expression

2
推荐指数
1
解决办法
4445
查看次数

while 检查变量是否在数组 bash 中

我的 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,它会接受它作为有效的网络接口,事实并非如此,我想排除它。我想我可以执行不包括所有数字用户输入的额外检查,但我想知道我的错误是什么?

linux bash network-interface

1
推荐指数
1
解决办法
5280
查看次数

使用 .netrc 文件的 CURL 请求

我正在尝试编写一个脚本,该脚本将凭据保存到 .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 文件中获取配置的用户名和密码?

security bash shell-script curl .netrc

1
推荐指数
1
解决办法
7496
查看次数