显然,广泛建议不要以超级用户帐户直接登录,但我很好奇。
FreeBSD 使用什么标志或设置来识别那些在登录时自动获得 su 权限的帐户,而无需用户执行任何登录脚本或额外的权限提升命令?
显然,广泛建议不要以超级用户帐户直接登录,但我很好奇。
FreeBSD 使用什么标志或设置来识别那些在登录时自动获得 su 权限的帐户,而无需用户执行任何登录脚本或额外的权限提升命令?
grep
并且sed
默认情况下都被描述为使用“基本正则表达式”(“BRE”)。BRE在这里有很好的描述。
但是考虑这个输出:
# echo ' aaaaa ' | grep '\(aaaaa\|bbbbb\)'
aaaaa
# echo ' aaaaa ' | sed '/\(aaaaa\|bbbbb\)/ s/ /_/g'
aaaaa
在第一个命令中,\( ... \| ... \)
语法显然是,(X OR Y)
因为输出通过了grep
。
在第二个命令中,\( ... \| ... \)
语法显然没有充当,(X OR Y)
因为空格没有更改为下划线。
(相比之下,两个命令都被识别\+
为“一个或多个重复”)
发生了什么事?为什么在 FreeBSD 中似乎有两种 BRE,其中一种可以识别另一种不能识别的语法?
更深层次的问题是,许多项目着眼于 BRE 以提供对其他类 unix 系统的可移植性。但这表明即使 BRE 在各个平台之间也不可能相同,即使它们在各个平台中都不相同。啊?
我目前正在使用 FreeBSD 11.2(可能会在一段时间内迁移到 12)。我需要一个小型的仅权威 DNS 服务器(无需查找或缓存,在 10 个域和 10 个查询/小时以下,几乎没有记录更改)。
我可能会选择, 其中的TinyDNS
一部分djbdns
,它以安全着称,而且看起来很小,可以满足我的需要。
安全的部分原因是它会暴露在互联网上,尽管在 IP/端口过滤器和非常低的速率、速率限制器(pf
用于此)之后。但出于这个原因,我确实想特别注意守护程序的设置方式,以避免明显的漏洞。我的意思是诸如所需的用户和组、启动/停止脚本、jail/chrooting 以及最小化/禁用/拒绝攻击者可能转向的主要非必要访问/功能等方面。
(我应该提一下,我可以在测试系统上“通常”安装 tinydns,并创建所需的.conf
文件,因此纯粹是如何以安全的方式运行它,这是缺失的)
我在设置软件以运行 chrooted/jailed 或查看 chrooted/jailed 包以获取适当的安全实践方面没有经验,这也是我第一次尝试做这样的事情,尽管我选择了特定的DNS 服务器包专门为其明显的设置简单性。
忽略该.conf
文件,“配方”会是什么样子,将 TinyDNS 设置为作为服务正确运行,并在理想情况下最小化对“其他对守护进程不是必需但对攻击者有帮助的东西”的访问?
IETF RFC 6763 第 7.1 节(第21 页)引用了一个名为“dns-sd”的 CLI 程序,可用于探测和报告零配置服务、记录和环境。许多其他网页也提到在 CLI 中使用它,但没有一个给出源代码库或原始 Web URL。我真的不想下载包含它的大包,因为我只想探测 dns 服务器,或者扫描可达网络并在 dns 服务器可能时获取 dns-sd 可访问服务/目录/?活动的详细转储或者可能没有运行,仅此而已,我找不到它的独立包,甚至找不到它的最终上游源。我什至不能 100% 确定它的功能,因为我也找不到它的文档。但这听起来是正确的。
任何想法如何追踪这样的事情?并且,如果它们存在,用于 FBSD 11.x 和各种 Linux 风格的端口(如果有完整的 Makefile+源,则可以编译)。这一次,谷歌不是我的朋友。也没有freshports,也没有我知道的任何其他搜索。
我已经查过了,找不到答案,如果以前有人问过,我提前道歉。
我在 FreeBSD () 上使用 shell ,我/bin/sh
想将所有以. 我能得到的最接近的是,但它只转储多行变量的第一行(有些是多行的,我需要它们全部),并且在病理边缘情况下可能容易出错,例如包含“ myvar ”的字符串碰巧在那部分之前的换行符。_myvar_
set | grep '^_myvar_'
如果我可以只列出变量名称(而不是值),那么我可以在 a 中过滤do...read...while
并一次只为具有匹配名称的 var 获取一个值,但我找不到这样做的方法。我也无法过滤完整的输出,因为没有确定性的方法来判断输出行是否包含延续或新变量,包含_myvar_
, =
或newline (\n)
字符的字符串不存在边缘情况问题,或者可能是尾随空格。我不想修改环境,因为代码包含在其他代码中,环境必须是稳定的。
如果有帮助,输出/列表包含任何匹配的环境变量都不是问题(如果存在的话——它们极不可能)
有没有办法做到这一点?
我正在编写一个 shell 函数,它通过 cURL 进行外部 API 调用(外部 API 语法不受我的控制)。我已经像这样接近它(简化):
#!/bin/sh
template_get_entry='get_entry:%s'
template_set_entry='set_entry:%s=%s'
curlheaders='-H stuff'
curluri="https://www.domain.com:1234/api.php"
# make an API call to get entry "foo"
call_api "$template_get_entry" "foo"
# make an API call to set entry "foo" to "bar"
call_api "$template_set_entry" "foo" "bar"
call_api() {
apicmd="$( printf "$1" "$2" "$3" )"
result="$( eval "/usr/local/bin/curl" "$curlheaders" "-d" "$apicmd" "$curluri" )"
retcode="$?"
.....stuff.....
}
这段代码有两个问题。
首先,args 的数量是可变的。如果调用行定义apicmd
时使用的参数少于最大数量,则 printf 将任何多余的命令解释为打印格式字符串的额外实例,以附加。我看不到解决此问题的正确方法。
其次,因为我使用了 eval,这会产生 eval 的连锁问题,因为 retcode 肯定会eval
从而不是从获取返回码curl
,而且我不知道防止/修复它的正确方法。
我应该怎么做这样的事情,它需要可变数量的参数?
我找不到这个答案 - 如果它是重复的,请道歉。
我/bin/sh
在 BSD 上使用(不是bash!),我正在尝试找出以下 IF 语句的语法。
我有两个组成条款。写成单独的语句,它看起来像这样:
if [ "$a" == "y" -o "$a" == "Y" ]; then
if printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
# both conditions met: do stuff
fi
fi
所以我可以使用嵌套if
作为一种解决方法。
但是我需要什么语法才能将它们整齐地组合成一个“if”语句?
注意:如果这个 shell 允许直接的正则表达式匹配比较([ "$a" =~ REGEX" ]
或类似的)而不是 requires grep -q
,这将是有用的,但我仍然想知道如何正确组合这些子句,因为有一天我肯定会有我正在匹配文件内容而第二个语句类似的情况ls -l "$b" | grep -qE 'SOME_REGEX'
,因此内联正则表达式比较不起作用... :)
我可能错过了一些明显的东西......但我看不到它。
我在 FreeBSD 上有一个由 NFSv4 ACL 控制的普通目录。ACL 说我可以列出它的内容;但我不能。
这是getfacl
问题目录及其父级+祖父级的输出:
# getfacl /mnt/data_dir/working_dir/
# owner: root
# group: wheel
group:data_managers:-w-pDd--------:-------:deny
everyone@:r-------------:-------:allow
group:data_managers:rwxpDda-R-c---:fd-----:allow
owner@:--------------:fd-----:allow
group@:--------------:fd-----:allow
everyone@:--x-----------:-d-----:allow
# file: /mnt/data_dir
# owner: root
# group: wheel
owner@:rwxpDdaARWcCos:fd-----:allow
group@:rwxpDdaARWcCos:fd-----:allow
everyone@:r-x---a-R-c---:fd-----:allow
# file: /mnt
# owner: root
# group: wheel
user::rwx
group::r-x
other::r-x
我su
作为新创建的帐户有 ACL 问题。此帐户不是任何相关目录的所有者,也不是wheel
or的成员data_managers
,因此它的唯一权利源自“每个人(世界)”权限/ACL。
$ su -f restricted_user
% id
uid=1100(restricted_user) gid=65533(nogroup) groups=65533(nogroup),4003(restricted_users)
% pwd
/mnt/data_dir/working_dir
% ls
ls: .: Permission denied
我不明白。该目录的世界权限是everyone@:r .....
(向下继承到“x”但不是“r”的子目录)。r
应授予全球范围内阅读working_dir
. 它不是 的成员,data_managers
如果是,则拒绝 ACE 不会拒绝r
或x
. 我可以穿越到它。但我无法阅读其内容。
我错过了什么?
在 FreeBSD 中,man mount_nullfs
声明:
文件系统的虚拟副本和符号链接之间的主要区别在于功能在虚拟副本中
getcwd(3)
正常工作,并且其他文件系统可以安装在虚拟副本上而不影响原始文件。为虚拟副本返回了一个不同的设备编号stat(2)
,但在其他方面它与原始设备没有区别。
本段的全部含义/含义是什么?
正如问题所说。
假设我想为我的 FreeNAS 池设置一个脚本化的“紧急按钮”——我可以单击它从 GUI 运行或在控制台/SSH 中执行,这会很快关闭可能正在读取或写入的所有内容,卸载文件系统,并且 - 理想情况下 - 静默它正在使用的磁盘或分区。
我不关心其他软件或远程连接引起的错误,或者过早中止任何长文件传输,我只希望它以最快的方式使池脱机,这与保持其一致性并可能给它一些任何挂起的写入完成和池处于一致状态以用于数据目的的秒数。
ZFS 命令建议的选项看起来并不乐观:zpool offline
仅适用于单个设备,因此如果在一次删除一个磁盘时发生写入,则可能会出现竞争条件;如果正在使用,则需要 -f 选项,并带有可能丢失数据zpool export
的警告。-f
可以使用池或其设备(数千个或数十万个?)检查所有打开file descriptors
的内容并手动强制关闭每个,但这可能会遇到竞争条件,因为它不会阻止同时创建新的 fd。我也不应该假设所有 ZFS 活动都由要发送退出信号的远程文件服务守护进程列表调解,因为某些文件活动可能是本地的(cron/CLI/分离会话)。
因此,看看如何最好地安全快速地使整个池脱机,这看起来umount
可能是我最好的选择 - 它在文件系统级别上工作,并且可以作为一个整体单元快速脱机整个文件系统,之后zpool export
看起来会然后能够在没有-f
选项的情况下以安全的方式实际完成和静默任何内部活动,从而使数据本身保持在有保证的一致状态。如果正在进行原始磁盘活动(重新同步或清理),那么我猜想当池稍后重新联机时会恢复或重新启动。
但umount
似乎并没有完全做到这一点,因为也可能有 iSCSIzvol
目标在使用中。由于服务器不知道其结构,因此其中的数据本质上无法保持一致,因此远程启动器在重新连接时必须尽可能地进行数据修复。我对此很好,但我不确定是否需要某种强制终止或离线目标的命令或最佳实践。(注意:强制终止连接与关闭单个 fd 的问题相同。)
我知道,如果在写入发生时池突然退出 RW 状态,肯定会出现某种数据丢失或问题。但只要它不失去一致性(在 ZFS 池和文件系统级别),那就没问题 - 任何正在更新的正在使用的文件/iSCSI 目标都必须在 ZFS 一致的文件/块上冒险但是由于在写入数据的中途离线而导致数据无效状态。这是不可避免的,也不是问题的问题。
那么我实际上需要执行哪些步骤,以尽可能快地使正在使用的池脱机,并与保证池的安全性和一致性保持一致 - 并且手动umount
使用正在使用的 ZFS 文件系统(作为解决方案的一部分)是安全的或承担任何数据损坏的风险?
更新:在这里提及以防其他人发现这很有用。接受的答案表明export -f
zvols(iSCSI 等)可能存在问题。基于这个提示,我发现 FreeNAS 使用的 iSCSI 处理程序可以强制注销/终止会话,并且还有其他可以预先发出的有用子命令 - 请参阅man ctladm
. 无论您的 zvol 用于什么用途,都可能有一些命令可以结束它们的会话。)