小编jay*_*ren的帖子

如何以编程方式判断文件名是否与 shell glob 模式匹配?

我想判断一个字符串$string是否会被一个 glob 模式匹配$pattern$string可能是也可能不是现有文件的名称。我怎样才能做到这一点?

假设我的输入字符串采用以下格式:

string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Run Code Online (Sandbox Code Playgroud)

我想找到一个bash成语,决定是否$string将被匹配$pattern1$pattern2或任何其它任意的glob模式。这是我迄今为止尝试过的:

  1. [[ "$string" = $pattern ]]

    这几乎有效,除了$pattern被解释为字符串模式而不是全局模式。

  2. [ "$string" = $pattern ]

    这种方法的问题$pattern是 展开然后在$string和 的展开之间执行字符串比较$pattern

  3. [[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]

    这个有效,但前提是$string包含存在的文件。

  4. [[ $string =~ $pattern ]]

    这不起作用,因为=~运算符导致$pattern被解释为扩展的正则表达式,而不是 glob 或通配符模式。

bash wildcards

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

为什么即使运行“apt-file update”后,apt-file 仍报告“缓存为空”?

apt-file update有谁知道为什么 apt-file 即使运行后也会报告缓存为空apt update

[pop-os ~][I]% apt-file search /usr/lib/android-sdk/tools/bin/sdkmanager
E: The cache is empty. You need to run "apt update" first.
[pop-os ~][I]% apt-file update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)
[pop-os ~][I]% sudo !!
sudo apt-file update …
Run Code Online (Sandbox Code Playgroud)

ubuntu apt package-management apt-file

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

两个具有相同卷组名称的物理磁盘阻止访问

我 8 岁的 fc22 电脑死了。我现在有一台运行 fc25 的新计算机。我经常备份我最重要的数据,所以并不是所有的数据都丢失了,但我想看看我的旧磁盘上有什么。

我有一个 USB 外壳,并将旧磁盘放入其中。它在插入时生成/dev/sdb1 和/dev/sdb2。/dev/sdb1 分区可立即访问并保存/boot。/dev/sdb2 在逻辑上被分成多个分区。不幸的是,给定的卷组名称是“fedora”。这与运行我的 fc25 系统的磁盘的名称相同。pvs 的输出是

  PV         VG     Fmt  Attr PSize   PFree

  /dev/sda3  fedora lvm2 a--  928.51g    0 

  /dev/sdb2  fedora lvm2 a--  465.27g 4.00m
Run Code Online (Sandbox Code Playgroud)

这是我想要了解的第二个卷组。

vgdisplay 的输出显示了两个“fedora”卷组:

除了最后一行之外,每个组的信息都比较枯燥。对于一卷,我得到:

  VG UUID               nMitQe-QmR1-tBP7-CTqm-VBR3-zUj5-UuTIml
Run Code Online (Sandbox Code Playgroud)

对于另一个我得到:

  VG UUID               0Fuho1-nVos-nYkZ-HFih-hPSK-dilF-AIDaxI
Run Code Online (Sandbox Code Playgroud)

当然,两卷都将 VG 名称显示为“fedora”。

UUID 中的这种差异是我获得机箱中卷数据的希望之光。一个直接

 # mount /dev/fedora/home /mountpoint
Run Code Online (Sandbox Code Playgroud)

没有得到我想要的。它只是给我第二次安装我的 fc25 磁盘,而不是机箱中的磁盘。

有谁知道如何利用我提供的信息来访问机箱中磁盘的第二个分区中的逻辑卷?

lvm

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

防止退出 ssh 会话时清除屏幕

我已将 rdist 设置为将我的一些 dot 文件推送到我需要 ssh 进入的所有远程机器。我还在所有这些机器上将 zsh 作为我的默认 shell。

当我 ssh 进入机器然后退出时,屏幕被清除。我觉得这种行为很烦人。我试图防止这种行为是/usr/bin/clear在我的.logout文件中注释掉这一行。然后我将这个更新的文件分发到所有远程机器。

问题是,那没有用。我不确定这一点,但我认为.logout是用于 csh,但我没有.zlogout(或者.bash_logout,就此而言)。我的其他点文件(例如.zshrc, .zshenv)中没有任何内容似乎会导致屏幕清除。当我通过 ssh 进入远程机器时exec zsh(为了获得“新的”shell 会话),那么终端在退出 ssh 会话时将不会清除。但否则,问题仍然存在 - 在我连接到的任何机器上,退出时屏幕会清除。

值得一提的是,当我将远程机器上的默认 shell 设置为 bash 时,我似乎没有遇到同样的问题。所以我认为问题出在 zsh 上。

我检查了点文件以确保它们被正确地分配(他们做到了)。除此之外,我的想法已经用完了……为什么我的终端在退出 ssh 时会一直被清除?

编辑:我找到了问题的根源:/etc/zlogout许多远程机器上都有一个文件。我在许多这些机器上没有 sudo 权限,我不想全局影响用户;有没有办法覆盖中的功能/etc/zlogout?简单地制作$HOME/.zlogout文件似乎不起作用。

ssh zsh

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

bash 脚本 - 从标准输入读取 tarball

我有一项需要编写脚本的任务,我觉得它应该非常简单,但实际上我过得很艰难。

我有一个简短的 bash 脚本,它采用 tarball 形式的特定类型的应用程序并构建它。目前它只需要两个命令行参数:应用程序的名称和 tarball 的位置。但是我准备在多主机系统上部署构建脚本,相反,我希望这个脚本将应用程序 tarball 放在 stdin 上,这将通过 ssh 进行管道传输。例如,这是我想调用脚本的方式:

ssh build-host "/usr/local/bin/build-app.sh myapp" < /tmp/myapp.tar.gz
Run Code Online (Sandbox Code Playgroud)

当像这样调用时,构建脚本将尝试构建一个名为“myapp”的应用程序。

我希望构建脚本在读取 tarball 之前执行一些完整性检查。此外,如果健全性检查失败,它应该正常退出。所以这是我第一次尝试构建脚本的要点:

#!/bin/bash

appname=$1

# example sanity check
if [ ! -d "/apps/$appname" ]; then
    mkdir "/apps/$appname"
else
    echo "Error! The app already has been built."
    exit 1
fi

# more sanity checks...

# if passed all tests, then read stdin into tarfile
cat > "/apps/$appname/app.tar.gz"

# build app ...
Run Code Online (Sandbox Code Playgroud)

这几乎有效。问题是我不知道如何从 bash 脚本中途读取 stdin。这个cat > file技巧只有在我把它放在脚本的第一行时才有效。但我不想那样做。在脚本的第一行,没有运行任何健全性检查,甚至无法确定将 …

bash tar pipe stdin fifo

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

通过本地 ssh 连接检测机器上的监视器

我需要编写一个脚本来检查本地网络中机器上的视频相关内容,例如

  • 显示器是否插好?
  • 视频驱动程序是否是最新的并且适合硬件?
  • Xorg 正在运行吗?

但是,我无法找到一种可靠的方法来判断监视器是否通过本地 ssh 连接插入。例如,如果我从机器 A ssh 到同一子网上的另一台机器 B,该xrandr工具返回有关插入机器 A 而不是机器 B 的监视器的信息。我尝试了许多其他工具,但都给出了相同的效果. 我如何确定我正在探测插入到我连接到的机器而不是我运行 shell 会话的机器的监视器?

ssh xorg video xrandr monitors

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

为什么我的 SSH 连接在 pubkey auth 成功后立即关闭?

我有两台 Windows 机器并尝试使用 CYGWIN 进行 SSH。当提示密码时它工作正常。但是,当我生成私有/公共对时,看起来身份验证成功,但出现连接关闭错误。

这是详细日志:请帮忙

debug1:可以继续的身份验证:publickey、password、keyboard-interactive
debug3:重新开始,传递不同的列表 publickey,password,keyboard-interactive
debug3:首选公钥,键盘交互,密码
debug3:authmethod_lookup 公钥
debug3:剩余首选:键盘交互,密码
debug3:authmethod_is_enabled 公钥
debug1:下一个身份验证方法:publickey
debug1:提供 RSA 公钥:/home/502537203/.ssh/id_rsa
调试 3:send_pubkey_test
debug3:发送数据包:类型 50
debug2:我们发送了一个公钥包,等待回复
debug1:认证成功(公钥)。
已通过主机名 ([xxxx]:22) 进行身份验证。
调试 1:通道 0:新的 [客户端会话]
debug3:ssh_session2_open:channel_new:0
debug2:通道 0:发送打开
debug3:发送数据包:类型 90
debug1:请求 no-more-sessions@openssh.com
debug3:发送数据包:类型 80
debug1:进入交互式会话。
debug1:质押:网络
debug3:发送数据包:类型 1
debug1:通道 0:空闲:客户端会话,nchannels 1
debug3:通道 0:状态:以下连接已打开:
  #0 客户端会话(t3 r-1 i0/0 o0/0 fd 4/5 cc -1)

远程主机关闭了与主机名的连接。
与主机名的连接已关闭。
Transferred:发送2056,接收1500字节,0.0秒
debug1:退出状态 -1

ssh cygwin sshd

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

USB 连接/分离的 udev 规则未触发

我正在运行 RHEL6,我正在尝试编写一个在插入和移除 USB 设备时触发的 udev 规则。我创建了一个名为80-usb.rulesin的文件,/etc/udev/rules.d/并给了它以下内容(到目前为止没有什么太具体的,只是想测试一下):

ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
Run Code Online (Sandbox Code Playgroud)

我保存了文件并插入 USB 驱动器进行测试。但是,/tmp/test未创建该文件。

我认为我的 udev 规则应该与我的 USB 驱动器匹配,因为我可以udevadm info在 USB 驱动器上运行并且至少一个父设备具有属性SUBSYSTEMS=="usb".

为什么 udev 规则可能不会被触发?

我试着运行udevadm test --action=add /path/to/device,很明显.rules我写的文件正在处理并且我的规则正在匹配。以下是输出中的一些相关行:

parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'
Run Code Online (Sandbox Code Playgroud)

但是,仍然/tmp/test不存在。我感到很困惑。很明显,这条规则正在被匹配,规则正在被应用。那么为什么不RUN执行指定的命令呢?

udev

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

为什么“dir-or-file-in-usr-local”是错误而不是警告?

我正在构建一些 rpm 包并使用rpmlint. 这些软件包特定于我工作场所的系统,它们不会被推到上游。我们的软件包包括各种软件,包括内部软件、存储库中软件的修补版本以及官方存储库中未提供的软件。我们安装本地包的/usr/local原因有很多:

  • 避免与官方包的命名冲突
  • 防止yum update破坏本地包
  • 允许本地包存在于单独的分区或磁盘上和/或通过 NFS 共享,以便包和配置可以在主机之间共享
  • 让我们有过被从官方仓库以外的来源,已安装的软件包更大的控制,很多不符合标准的安装路径(binlibincludeshare,等)

但是,rpmlint在将文件安装到/usr/local. 例如,在 GNU Hello World 的自定义构建中,这就是rpmlint -i必须说的:

hello.x86_64: E: dir-or-file-in-usr-local /usr/local/hello-2.8/bin/hello
A file in the package is located in /usr/local. It's not permitted for
packages to install files in this directory.
Run Code Online (Sandbox Code Playgroud)

我知道文件系统层次结构标准,根据该标准

'/usr/local' 背后的最初想法是在除了 '/usr' 之外的每台机器上都有一个单独的('local')'/usr' 目录,它可能只是从其他地方以只读方式挂载。它复制“/usr”的结构。现在,'/usr/local' 被广泛认为是保存自编译或第三方程序的好地方。/usr/local 层次结构供系统管理员在本地安装软件时使用。它需要在系统软件更新时不会被覆盖。它可用于可在一组主机之间共享但在 /usr 中找不到的程序和数据。本地安装的软件必须放在 /usr/local 而不是 /usr 中,除非安装它是为了替换或升级 …

fhs rpm rpmbuild rpmlint

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

模糊输出重定向

我正在尝试将 stderr 重定向到 stdout,然后再重定向到 init 脚本中的文件,但是当我将 stderr 引入 stdout 时,我收到了“Ambiguous output redirect”错误。单独的标准输出不会导致错误,并写入我所说的日志文件。我试过以下

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log &

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)

任何意见,将不胜感激。

bash io-redirection stdout stderr

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

dmesg 的输出中“Worm 正在初始化...”是什么意思?

我有一个 RHEL 5 系统:

[root@myhost ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
Run Code Online (Sandbox Code Playgroud)

当我运行时dmesg,我收到一条奇怪而令人不安的消息:

[root@myhost ~]# dmesg | grep -i worm
Worm initializing...<1>done.
Run Code Online (Sandbox Code Playgroud)

这个消息是什么意思,它来自哪里?

这是完整的 dmesg 输出

linux rhel dmesg

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

如何写入正在运行的 docker 容器内的文件?

随着cat我可以从文件到stdout阅读。例如,我可以通过这种方式将文件从 docker 容器中导出:

docker exec my_container cat file > file_on_host
Run Code Online (Sandbox Code Playgroud)

当我想做相反的事情时,我需要一个从标准输入读取并保存到文件的命令。有这样的命令吗?

docker exec my_container ??? file < file_on_host
Run Code Online (Sandbox Code Playgroud)

io-redirection docker

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

标签 统计

bash ×3

ssh ×3

io-redirection ×2

apt ×1

apt-file ×1

cygwin ×1

dmesg ×1

docker ×1

fhs ×1

fifo ×1

linux ×1

lvm ×1

monitors ×1

package-management ×1

pipe ×1

rhel ×1

rpm ×1

rpmbuild ×1

rpmlint ×1

sshd ×1

stderr ×1

stdin ×1

stdout ×1

tar ×1

ubuntu ×1

udev ×1

video ×1

wildcards ×1

xorg ×1

xrandr ×1

zsh ×1