我最近设置了 Fedora 28 和 Ubuntu 18.04 系统,并希望在这两个系统上配置我的主用户帐户,以便我可以在sudo
不提示输入密码的情况下运行命令。
我怎样才能在各自的系统上做到这一点?
鉴于这个最小的例子
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; )
它输出LINE 1
,然后在一秒钟后LINE 2
,按预期输出。
如果我们通过管道将其发送到grep LINE
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE
正如预期的那样,行为与前一种情况相同。
或者,如果我们通过管道将其发送到cat
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | cat
正如预期的那样,行为再次相同。
但是,如果我们通过管道传输到grep LINE
,然后传输到cat
,
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE | cat
直到一秒钟过去才有输出,并且两条线都立即出现在输出上,这是我没想到的。
为什么会发生这种情况,如何使最后一个版本的行为与前三个命令相同?
我今天遇到了一个 Bash 脚本,其中包含带有双冒号::
的函数名称,例如,file::write()
和file::read()
。我以前从未在 Bash 脚本中看到过这种语法,当我调用该脚本时,它运行得很好(令我惊讶)。
在我的系统(和在线)上搜索 Bash 的手册页后,我在文档中找不到任何支持此函数名称语法的内容。例如,该部分Shell Defined Functions
将 shell 函数的语法定义为
function name [()] compound-command [redirection]
然后(在手册的其他地方)令牌name
被定义为
name A word consisting only of alphanumeric characters and
underscores, and beginning with an alphabetic character
or an underscore. Also referred to as an identifier.
没有提到函数名称的双冒号语法。
到目前为止,我发现的对这种双冒号语法的唯一其他参考是在这个Shell 样式指南(参见小节Naming Conventions > Function Names
)中,它建议对“包”中的函数名称使用双冒号语法——例如,mypackage::myfunction()
.
函数名称的这种双冒号语法是 Bash shell 的合法特性,还是可能是未记录的特性?如果它是合法的,那么它在 Bash 手册中的哪里记录?我看了又看,但在手册中找不到任何关于它的内容。我发现最接近的是::
在PATH
环境变量中使用将当前工作目录添加到搜索路径。
例子
#!/bin/bash
function abc::def() {
echo "${FUNCNAME[0]}"
}
abc::def
我在三个不同的 Linux 发行版上测试了这个脚本,并且在所有三个上,脚本都打印abc::def
到标准输出。
在阅读了 Linux 命名空间之后,我的印象是,在许多其他特性中,它们是 chroot 的替代品。例如,在这篇文章中:
[命名空间] 的其他用途包括 [...] chroot() 风格的进程隔离到单个目录层次结构的一部分。
但是,当我克隆挂载命名空间时,例如使用以下命令,我仍然可以看到整个原始根树。
unshare --mount -- /bin/bash
我知道我现在能够在不与原始命名空间共享的新命名空间中执行额外的挂载,因此这提供了隔离,但它仍然是同一个根,例如/etc
对于两个命名空间来说仍然是相同的。我还需要chroot
更改根目录还是有替代方法?
我原以为这个问题会提供答案,但答案仅使用chroot
, 。
有一条现已删除的评论提到pivot_root
. 由于这实际上是 的一部分linux/fs/namespace.c
,因此它实际上是命名空间实现的一部分。这表明仅使用unshare
and更改根目录mount
是不可能的,但命名空间提供了一个自己的更聪明的chroot
. chroot
即使在阅读了源代码之后(例如在安全性或更好的隔离方面),我仍然不明白这种方法的主要思想,这使得它与.
这不是这个问题的重复。从答案中执行所有命令后,我有单独的 /tmp/tmp.vyM9IwnKuY (或类似的),但根目录仍然相同!
从这篇文章中可以看出这FS:[0x28]
是一个堆栈金丝雀。我在这个函数上使用 GCC 生成相同的代码,
void foo () {
char a[500] = {};
printf("%s", a);
}
具体来说,我得到这个程序集..
0x000006b5 64488b042528. mov rax, qword fs:[0x28] ; [0x28:8]=0x1978 ; '(' ; "x\x19"
0x000006be 488945f8 mov qword [local_8h], rax
...stuff...
0x00000700 488b45f8 mov rax, qword [local_8h]
0x00000704 644833042528. xor rax, qword fs:[0x28]
0x0000070d 7405 je 0x714
0x0000070f e85cfeffff call sym.imp.__stack_chk_fail ; void __stack_chk_fail(void)
; CODE XREF from 0x0000070d (sym.foo)
0x00000714 c9 leave
0x00000715 c3 ret
设置的值是fs:[0x28]
什么?内核,还是 GCC 在代码中抛出?你能在内核中显示代码,或者编译成设置的二进制文件fs:[0x28]
吗?金丝雀是在启动时重新生成的,还是在进程生成时重新生成的?这是在哪里记录的?
一个小型物联网服务器返回一个文件,其名称由当前日期和时间给出,以使其唯一。格式为2018.07.04.18.22.45.dat
.
在浏览器中请求地址XX.XX.XX.XX:5001/read
(禁用浏览器缓存),文件将以其原始名称返回。
唉,使用 wget,我无法保留文件名:
wget XX.XX.XX.XX:5001/read
返回正确的内容,但带有 name read
、read.1
、read.2
等。
是否有可能保留名称、使用wget
或其他命令来收集它?
附录:使用curl XX.XX.XX.XX:5001/read
我获取原始内容而不是文件。
附录:作为一个不完美的解决方法,我可以生成一个基于时间戳的文件名wget -o $(date "+%Y.%m.%d-%H.%M.%S.%N.dat") XX.XX.XX.XX:5001/read
。当然,它与原始文件名不匹配。
json输入:
[
{
"name": "cust1",
"grp": [
{
"id": "46",
"name": "BA2"
},
{
"id": "36",
"name": "GA1"
},
{
"id": "47",
"name": "NA1"
},
{
"id": "37",
"name": "TR3"
},
{
"id": "38",
"name": "TS1"
}
]
}
]
预期,输出是两行:
name: cust1
groups: BA2 GA1 NA1 TR3 TS1
我试图构建过滤器但没有成功..
$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1
更新:下面提供的解决方案工作正常,但我没有预测不存在组的情况:
[
{
"name": "cust1",
"grp": null
}
]
在这种情况下,提供的解决方案会返回错误:
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json2
name: cust1
jq: error (at test_json2:6): Cannot iterate over null (null)
任何解决方法表示赞赏。
CheckPoint 提供的用于设置 SSL 网络扩展器 VPN 的官方 Checkpoint out 命令行工具不再在 Linux 命令行中工作。CheckPoint 也不再积极支持它。
但是,有一个很有前途的项目,它试图复制 Java 小程序以进行身份验证,它与snx
名为snxconnect
.
我试图让snxconnect
文本实用程序在 Debian Buster 中工作,这样做:
sudo pip install snxvpn
和
export PYTHONHTTPSVERIFY=0
snxconnect -H checkpoint.hostname -U USER
但是,它大多死于以下 HTTP 错误:
HTTP/1.1 301 Moved Permanently:
或者:
Got HTTP response: HTTP/1.1 302 Found
或者:
Unexpected response, try again.
该怎么办?
PS。EndPoint Security VPN 官方客户端在 Mac High Sierra 和 Windows 10 Pro 中运行良好。
我正在使用 CentOS 7。我想获取在端口 3000 上运行的进程的 PID(如果存在)。我想获取此 PID,以便将其保存到 shell 脚本中的变量中。到目前为止我有
[rails@server proddir]$ sudo ss -lptn 'sport = :3000'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
Cannot open netlink socket: Protocol not supported
LISTEN 0 0 *:3000 *:* users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7))
但我无法弄清楚如何在没有所有这些额外信息的情况下单独隔离 PID。