仍在学习,我迷失于IFS =

#!/bin/bash
inotifywait -m -r --excludei '(.txt$|.old$|.swp$|.swx$|.swpx$|.zip$)' /path/to/watch -e create |
    while read path action file; do
        cd $path
        USER="$(stat -c %U $file)"
        echo "To: User <user@domain.com>
CC: Support <user@domain.com>
From: $USER <user@domain.com>
Subject: $USER has Uploaded a new File

The user '$USER' uploaded the file '$file' to '$path'" >  /mnt/remote/ian/temp2.txt
    cat /path/to/temp/file.txt | ssmtp list@domain.com
    rm /path/to/temp/file.txt
done

这是我有史以来第一个脚本,只要上传的文件名中没有空格,它就可以很好地工作。 我已经阅读了一些使用IFS ='whatever'来定义字段分隔符的脚本,但是我不想在生产中弄乱它。 它可以工作,但是当我无法获取上载文件的用户名时,这使我很烦。 请给我一个提示。

#1楼 票数:1

这可以由知道您的实现并想要欺骗任意数据(通过使用换行符创建文件名)的攻击者破解,但这是一个粗略的初稿:

while IFS= read -r -d $'\n' path && IFS= read -r -d $'\n' file; do
    user=$(stat -c %U "$file")
    printf 'File %q created by %q in %q\n' "$file" "$user" "$path"
done < <(inotifywait --format $'%w\n%f\n' ~/tmp -r -e create)

我强烈建议向上游inotifytools提交票证,要求该功能在格式字符串中使用\\0


顺便说一下,这已经出现在inotify-tools邮件列表中, Stephane Chazelas在其中提供了一种解决方法

nl="
"
inotifywait --syslog -e close_write -mr /tmp --format '%f///' |
  while IFS= read -r file; do
    while :; do
      case $file in
        (*///) file=${file%///}; break
      esac
      IFS= read -r extra || exit
      file=$file$nl$extra
    done

    something with "$file"

  done

  ask by snowexcuse translate from so

未解决问题?本站智能推荐:

1回复

在while循环中将空格分隔的字符串读入数组

我想读取所有者以获取文件列表,然后将其与当前所有者进行比较,如果不一致,则输出错误。 我有以下内容,为了简单起见,我用一个简单的echo代替了比较,因为不是比较出错了: stat返回一个字符串列表(在这种情况下为3个值),在这种情况下全部带有我的用户名,但read只是将其输出为单个
1回复

从变量问题读取循环参数时进行bash

我有一个带有以下变量的bash脚本: 我需要从变量中读取参数,然后循环使用它们。 但它只对所有项目返回一次echo: 我究竟做错了什么? 如何重做脚本,因此每次只能使用一个项目?
1回复

bash使用“读时”读取多个文件

当我有一个文本文件要使用bash逐行读取时,命令如下所示: while IFS='' read -r line || [[ -n "${line}" ]]; do [code goes here] done <(${filename}) 现在,我有几个文件(命名为1.txt
2回复

Bash while循环读取和IFS

我必须以以下格式解析文件: 然后逐行处理,从当前行中提取所有参数。 目前,我已经通过以下方式进行管理: 如何避免创建临时文件? 不幸的是,这不能正常工作: 由于整行都分配给了param1。
2回复

使用 IFS$'\\n' 将 -r jq 读入多个变量

我目前有以下代码可以按我的意愿工作。 它输出以下所需的输出: 但是,我的问题是,有没有办法使用 IFS 来避免 3 个单独的读取语句? 我想出了以下内容,但是,它生成的输出不太正确。 看起来它只读入第一个变量。 输出: 我觉得必须有一种方法可以做到这一点,但是我已经研究了一段时间但没
4回复

将多个 jq 值传送到“while read -r”循环

我正在尝试找到一种干净的方法,在 while 循环中将 2 个 json 字符串值分配给 2 个变量。 我正在使用的循环和输入如下。 输入: 目前我有以下几点: 在迭代 1 中,我想要: 迭代 2: 但是,这会生成以下不正确的输出: 我整天都在这,任何意见或建议将不胜感激!
1回复

为什么在while循环中使用sudo时,sudo会将阻止命令更改为非阻止命令?

还是: 如何防止while循环中sudo'ed rsync无限触发? 因为这都是(感觉)正在发生的事情,但我不明白。 我试图设置一个手表来同步修改的文件,并且工作正常。 但是,一旦将所需的sudo引入rsync命令,单个inotify事件就会导致rsync命令无限期启动。 编辑
1回复

jq:解析并显示 JSON 中的多个值

我有这个test.json文件 我正在尝试使用 IFS while 循环读取值: 我想获取key和field_1的值以在curl请求中使用它们。