AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-86874

Greg Nisbet's questions

Martin Hope
Greg Nisbet
Asked: 2019-03-28 23:03:41 +0800 CST

用每个标签固定数量的空格替换缩进标签

  • 3

是否可以仅用每个选项卡的一定数量的空格替换“前导选项卡”?我将前导制表符定义为仅以制表符或空格开头的制表符。我将前导或缩进选项卡定义为仅以空格开头的选项卡。

我的 . 中有以下一行.nexrc,抄自这一行。它通过过滤器运行包含标记a和标记的行之间的行。b替换标签。

map \2 'a!'b pr -te2

但是,它很好地用两个空格替换了非前导制表符,这并不理想,因为有时需要文字制表符。

是否有一种简单且便携的方法可以仅用每个选项卡的一定数量的空格替换前导选项卡?

以下 perl 脚本(可以折叠为单行)使用命令行上提供的宽度替换前导制表符的工作,但它依赖于 Perl 的可用性并且需要二次时间(如果文件不包含任何内容但标签)。

#!/usr/bin/env perl

use strict;
use warnings;

my ($width) = @ARGV;
$width //= 2;
my $replacement = ' ' x $width;

while (<>) {
    while (s/^(\s*)\t/$1$replacement/g) { }
    print;
}

这是我想要发生的事情的一个例子。^I指的是制表符字节,#是行首的零宽度标记。下面的行是一个字节标尺。

前:

#^I^I ^Ia^Ib
# 1 23 45 67

之后(标签宽度为 2)

#       a^Ib
#12345678 90

之后(标签宽度为 4)

#             a^Ib
#12345678901234 56
text-processing text-formatting
  • 1 个回答
  • 482 Views
Martin Hope
Greg Nisbet
Asked: 2019-03-22 15:11:55 +0800 CST

在父进程和子进程中关闭目录流(DIR *)是否安全?

  • 2

此页面描述了函数的保证行为,readdir并readdir_r包含以下句子:

在调用 fork() 之后,父或子(但不是两者)可以继续使用 readdir()、rewinddir() 或 seekdir() 处理目录流。如果父进程和子进程都使用这些函数,则结果未定义。

我正在围绕DIR*-related 函数系列编写一个 fork-safe 包装器作为练习,我想知道它是否closedir同时对父级和子级中的目录流是安全的,或者不继续读取的进程是否从目录流根本不应该与目录流交互。

posix
  • 1 个回答
  • 164 Views
Martin Hope
Greg Nisbet
Asked: 2019-02-26 13:25:37 +0800 CST

在查看输出时减少切换原始性

  • 2

less -R <file>每当我想查看可能包含 ansi 转义码(尤其是颜色)的文件时,我都会本能地键入。

有时,如果我在较长的管道中使用较少的内容,但我忘记了-R并且无法在不再次运行命令的情况下轻松返回并修复它。

是否有任何常见的变体less(GNU 或其他)公开了在程序运行时在“原始”字符模式和非原始字符模式之间切换的能力?

less colors
  • 1 个回答
  • 215 Views
Martin Hope
Greg Nisbet
Asked: 2019-01-10 16:48:08 +0800 CST

suid 可执行文件没有提升权限,但`sudo` 确实提升了

  • 2

我正在尝试编写一个程序,该程序将在不提示输入密码或确认的情况下快速关闭笔记本电脑。笔记本电脑运行的是 Linux,特别是 Manjaro。

为此,我正在尝试制作一个使用固定参数执行的setuid可执行文件(并且还生成一个 shell)。我在这里只是为了保持程序简短,从安全的角度来看这是一个糟糕的主意。downnowshutdownsystem

// downnow.c
#include <stdlib.h>

int main() {
  system("shutdown --no-wall --halt now");
  return 0;
}

然后我编译downnow,把它移到/bin,改变它的所有者并给它 setuid 和 setgid 权限:

$ sudo chown root /bin/downnow 

$ sudo chgrp root /bin/downnow 

$ sudo chmod u+s /bin/downnow 

$ sudo chmod g+s /bin/downnow 

但是,当我尝试以downnow非特权用户身份执行时,它无法与 systemd 通信。

$ downnow 
Failed to halt system via logind: Interactive authentication required.
Failed to talk to init daemon.

ch{own,grp,mod}我在ing之前和之后收到相同的消息。

stat/bin/downnow在和上报告相同的权限/usr/bin/sudo。

$ stat /bin/downnow 
  File: /bin/downnow
  Size: XXXX        Blocks: XX         IO Block: XXXX   regular file
Device: XXXXX/XXXXX Inode: XXXXXX     Links: 1
Access: (6755/-rwsr-sr-x)  Uid: (    0/    root)   Gid: (    0/    root)

$ stat /usr/bin/sudo
  File: /usr/bin/sudo
  Size: XXXXXX      Blocks: XXX        IO Block: XXXX   regular file
Device: XXXXX/XXXXX Inode: XXXXXXX     Links: 1
Access: (4755/-rwsr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)

为什么在完美运行downnow时可能无法提升其特权?sudo

setuid
  • 2 个回答
  • 616 Views
Martin Hope
Greg Nisbet
Asked: 2018-12-31 20:43:29 +0800 CST

能够将 `\r` 视为空白字符的 Shell

  • 7

作为一个个人项目,我正在尝试编写一个脚本来清理在 Cygwin 下运行的 Windows 10 附带的一些无关文件。我希望脚本可以复制和粘贴,这需要它对不同类型的换行符具有鲁棒性。是否有任何类似sh- 的 shell 暴露了将其\r视为空格的能力,可能在设置了某些选项时?

这是一件很奇怪的事情。答案可能归结为“是的,这是一件奇怪的事情,而且没有办法做到这一点”。

cygwin newlines
  • 1 个回答
  • 801 Views
Martin Hope
Greg Nisbet
Asked: 2018-12-22 18:40:15 +0800 CST

`less` 打开编辑器而不立即触发终端中的重绘

  • 1

我正在尝试切换到主要less在我只想阅读代码时使用的工作流程,然后v在我想编辑文档时使用切换到编辑器。这是 OS X 上的 GNU,但我认为它可以推广到其他系统。

如果我设置VISUAL为vim -u NONE使 vim 不读取它的任何初始化文件,或者使用另一个像nanoorjoe或那样立即启动的编辑器,那么在按下和让文件出现在编辑器中ne之间没有明显的停顿。v


例如,这很好用:

$ previous-command > foo.txt
$ VISUAL='vim -u NONE' less foo.txt

查看文件less,滚动到感兴趣的行并按下v,文件在里面立即可见vim。


只是为了说明这一点,如果我们设置VISUAL为sleep 1; vim.

$ another-previous-command > foo.txt
$ VISUAL='sleep 1; vim -u NONE' less foo.txt

我们现在正在查看文件,然后我们按v编辑它。

shell 会话现在再次可见一秒钟,因此我们看到:

$ another-previous-command > foo.txt
$ VISUAL='sleep 1; vim -u NONE' less foo.txt

第二个过去后,我们看到了foo.txtvim 内部的内容。


只需单独使用vim,无需额外的命令行参数,读取文件并进行一些初始化工作。这需要几分之一秒,但足够长以使底层 shell 会话可见,如sleep 1; <VIM COMMAND>.

有没有办法以这样一种方式将控制权从 转移less到vim,以使底层的 shell 会话不可见,甚至部分不可见?

less terminal-emulator
  • 1 个回答
  • 470 Views
Martin Hope
Greg Nisbet
Asked: 2018-12-14 11:49:05 +0800 CST

可移植地执行字段拆分但不执行其他扩展

  • 0

$variable我曾经在存储编译器标志时使用不带引号的扩展variable,但我最近了解到像*和?包含在variable中的 glob 元字符仍然被扩展,例如

$ f='*'
$ echo $f
foo.bash

除了set -f.

在 bash 中,我能想出的最明确的方法是定义一个read_words这样的函数,它使用作为参数传入的字符串的内容填充数组名称,然后用于${arr[@]}扩展字符串。

#!/bin/bash

count() {
  printf '%s\n' "$#"
}


read_words() {
  IFS=$' \t\n' read -a "$1" <<< "$2"
  return 0
}

read_words arr 'a b *'
count "${arr[@]}"
shell wildcards
  • 2 个回答
  • 48 Views
Martin Hope
Greg Nisbet
Asked: 2018-11-11 11:23:34 +0800 CST

ed 尽可能简洁地打印下 n 行

  • 4

我试图ed更好地理解 DSL,因为它的版本出现在其他工具中(例如sed, vim)。

使用ed它可以打印接下来的 4 行,使用.,+4nwhere.,+4是从当前行开始并向下延伸 4 行的显式范围。

然而,围绕当前行打印几行作为上下文似乎很重要,值得一些语法糖分。

是否已经有相对于当前行的行范围的缩写ed?

例如,在下面的成绩单中.,+4n似乎相当长。

$ touch ~/foo
$ ed '-p* ' ~/foo
0
* 0a
1
2
3
4
5
6
7
8
9
10
11
.
* 5
5
* .,+4n
5   5
6   6
7   7
8   8
9   9
ed
  • 1 个回答
  • 144 Views
Martin Hope
Greg Nisbet
Asked: 2018-10-17 13:46:16 +0800 CST

直接清除特定的 X 缓冲区,无需经过 xsel 或 xclip

  • 3

我正在尝试使用Radivarig 的解决方案完全禁用从缓冲区粘贴的中键。

把这个放在~/.xbindkeysrc

"echo -n | xsel -n -i; pkill xbindkeys; xdotool click 2; xbindkeys"
b:2 + Release

但是,此解决方案取决于xsel(或等效xclip地)快速完成其工作。

最近我注意到尝试清除主缓冲区时xsel延迟了几秒钟。xclip

是否有比强制 X 清空特定缓冲区的任何方式xsel或正在采取的方式更不“礼貌”的方式?xclip

有问题的 Linux 发行版是 Manjaro ......这可能是 Manjaro 或 Arch 特定的错误,但关于如何在没有或其他类似工具的情况下与 X11 服务器交互的面向最终用户的信息xsel似乎xclip有些缺乏。

~  > xclip -selection primary -verbose -in </dev/null
Connected to X server.
Using selection: XA_PRIMARY
Using UTF8_STRING.
Waiting for selection requests, Control-C to quit
  Waiting for selection request number 1
  Waiting for selection request number 2
Time: 13s

~  > xclip -selection primary -verbose -in </dev/null
...
Time: 11s

~  > xclip -selection primary -verbose -in </dev/null
...
Time: 23s

我连接gdb到一个挂起xclip的 s 上,它似乎一直在等待来自 X 服务器的响应。

(gdb) where
#0  0x00007f905e1f1b78 in poll () from /usr/lib/libc.so.6
#1  0x00007f905dc68630 in ?? () from /usr/lib/libxcb.so.1
#2  0x00007f905dc6a2db in xcb_wait_for_event () from /usr/lib/libxcb.so.1
#3  0x00007f905e306009 in _XReadEvents () from /usr/lib/libX11.so.6
#4  0x00007f905e2f4ee1 in XNextEvent () from /usr/lib/libX11.so.6
#5  0x0000563eb8eaea70 in ?? ()
#6  0x00007f905e125223 in __libc_start_main () from /usr/lib/libc.so.6
#7  0x0000563eb8eaf53e in ?? ()

我尝试根据部分xsel源代码直接使用 X API 编写精简程序,特别是:https ://github.com/kfish/xsel/blob/master/xsel.c#L1003-L1018 。

为了清除缓冲区,xsel 似乎依赖于以下属性XSetSelectionOwner:

如果新所有者(无论是客户端还是 None )与选择的当前所有者不同并且当前所有者不是 None ,则向当前所有者发送 SelectionClear 事件。如果作为选择所有者的客户端稍后终止(即其连接关闭),或者如果它在请求中指定的所有者窗口后来被销毁,则选择的所有者自动恢复为 None ,但最后一个-更改时间不受影响。X 服务器不解释选择原子。XGetSelectionOwner() 返回所有者窗口,在 SelectionRequest 和 SelectionClear 事件中报告。选择对于 X 服务器来说是全局的。

这是我尝试精简xsel到我需要的功能。

我假设XA_PRIMARY缓冲区的所有者通常不是None. 我将它设置None在我的 C 程序的主体内,然后希望它能够工作。

// clear.c
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <assert.h>

// always debug
#undef NDEBUG

static Display * display = NULL;

static char * display_name = NULL;

static void clear_selection(void)
{
  printf("%d\n", 300);
  display = XOpenDisplay(display_name);
  assert(display != NULL);
  printf("%d\n", 200);
  XSetSelectionOwner(display, XA_PRIMARY, None, CurrentTime);
  printf("%d\n, 500);
  XSync(display, False);
  return;
}

int main(void)
{
  printf("%d\n", 100);
  clear_selection();
  printf("%d\n", 200);
  return 0;
}

该程序运行并打印

100
300
400
500
200

正如预期的那样。

但是,它未能清除主缓冲区。

xclip -selection -primary out前后显示相同的东西。

x11 x
  • 1 个回答
  • 405 Views
Martin Hope
Greg Nisbet
Asked: 2018-08-17 19:22:55 +0800 CST

变量扩展中默认值的元字符处理

  • 0

当为变量扩展(例如${varname-default})提供默认值时,构成的字符将如何default解释?

天真地,我会猜测变量替换(例如 $b)和类引号字符的扩展', ",\会发生在这种情况下……但似乎并不总是会发生类引号字符的扩展。

例如,

> echo x${a-''}y
xy

但

> echo x"${a-''}"y 
x''y

我预计xy在这两种情况下,因为扩展像${a-$PATH}和这样的变量的构造( BRACE='}'; echo ${a-$BRACE} )工作正常。

但是GNU bash, version 4.4.19(1)-release,...两者的最新版本mksh具有相同的行为,''其中字面上包含在第二个示例的输出中。

shell
  • 1 个回答
  • 109 Views
Martin Hope
Greg Nisbet
Asked: 2018-07-19 20:10:25 +0800 CST

如何取消当前进程的网络共享

  • 3

可以使用 以非 root 身份在没有网络访问权限的情况下运行新命令unshare -r -n,例如:

$ unshare -r -n ls
a.txt  b.txt

一个确实需要网络访问的命令将会失败。

$ unshare -r -n curl unix.stackexchange.com
curl: (6) Could not resolve host: unix.stackexchange.com

我想知道是否可以通过写入一个神奇的文件/sys或类似的东西来删除当前进程的网络访问。

我希望能够做类似的事情

$ /bin/sh -c 'echo 1 > /sys/unsharethis; curl unix.stackexchange.com'

strace-ing的摘录unshare -r -n ls显示了unshare系统调用

open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4759040, ...}) = 0
mmap(NULL, 4759040, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7ec6968000
close(3)                                = 0
unshare(CLONE_NEWUSER|CLONE_NEWNET)     = 0
open("/proc/self/setgroups", O_WRONLY)  = 3
write(3, "deny", 4)                     = 4

这向我表明,从当前进程取消共享网络访问实际上是实现取消共享的唯一方法(即它不能作为参数传递给spawn或与其等价物)。它还表明从 shell 脚本取消共享将不起作用,除非 shell 已被专门扩展以暴露unshare.

linux networking
  • 1 个回答
  • 2033 Views
Martin Hope
Greg Nisbet
Asked: 2018-07-14 13:33:49 +0800 CST

ANSI 转义序列 ^[[K 由 less -R 但不是大多数处理

  • 1

我正在编写一个包装器ack以在本地搜索代码,并将一些额外的上下文行通过管道传输到寻呼机。

这是包装脚本ackc。在不同的示例之间,我将改变传递ack给--pager.

#!/bin/sh

ack -C 20 -i \
    --pager=most \
    --heading \
    --break \
    --color \
    --show-types \
    "$@"

使用less(没有-R)作为寻呼机,几乎所有的转义序列都使用插入符号表示(不知道这叫什么。^[是例外。它被渲染为ESC使用倒置的背景颜色(此处未复制颜色) .

这是输出示例(由ackcwith--pager=less和环境变量(如LESS,LESSPIPE等清除)产生)

ESC[1;32m.local/lib/python2.7/site-packages/markupsafe/_speedups.cESC[0m
...
ESC[1;33m19ESC[0m:#define PY_SSIZE_T_MAX ESC[30;43mINTESC[0m_MAXESC[0mESC[K
ESC[1;33m20ESC[0m:#define PY_SSIZE_T_MIN ESC[30;43mINTESC[0m_MINESC[0mESC[K

这里重要的转义序列是^[[K每行末尾包含突出显示的项目的序列。由 适当处理less -R。

.local/lib/python2.7/site-packages/markupsafe/_speedups.c
...
19:#define PY_SSIZE_T_MAX INT_MAX
20:#define PY_SSIZE_T_MIN INT_MIN

most但是,似乎并没有很好地处理它。

.local/lib/python2.7/site-packages/markupsafe/_speedups.c
1-/**
...
19:#define PY_SSIZE_T_MAX INT_MAX^[[K
20:#define PY_SSIZE_T_MIN INT_MIN^[[K

它按原样通过^[[K序列。

这个序列是CSI (n) K -- EL -- Erase in Line。如果没有给出参数,它会擦除​​到行尾。如果匹配的术语出现在行尾,则可能需要清除背景颜色的杂散位。

有没有理由most不理解这个序列?我可以配置它以正确处理它吗?

escape-characters most
  • 1 个回答
  • 586 Views
Martin Hope
Greg Nisbet
Asked: 2018-02-11 20:19:13 +0800 CST

`file` 报告的解释器指的是什么?

  • 3

我正在尝试perl在 Ubuntu 16.04 上运行调试库提供的可执行文件,但由于某种原因,该文件“不可执行”,即使它似乎与我的架构匹配。

perlUbuntu 16.04 附带的可执行文件被剥离

$ nm /usr/bin/perl
nm: /usr/bin/perl: no symbols

该perl-debug包装提供了一个perl未/usr/lib/debug剥离的底部。

$ nm /usr/lib/debug/usr/bin/perl | head
                 U abort@@GLIBC_2.2.5
0000000000589020 r AboveLatin1_invlist
                 U accept@@GLIBC_2.2.5
                 U access@@GLIBC_2.2.5
000000000058e002 r a_hash.16944
                 U alarm@@GLIBC_2.2.5
000000000058e010 r an_array.16943
00000000005795c0 r ASCII_invlist
0000000000543430 T ASCII_TO_NEED
                 U atan2@@GLIBC_2.2.5

但是,当您尝试运行它时,它会exec*失败并bash给您一个很好的消息:

$ /usr/lib/debug/usr/bin/perl
bash: /usr/lib/debug/usr/bin/perl: cannot execute binary file: Exec format error

但是,当我file在两个 perl 上运行时,我看到调试 perl 被标记为“有一个空的解释器”,其中常规 perl 有一些 ld 共享对象。它可能与链接器有某种关系ld,但我不知道它是什么。

$ file /usr/bin/perl
/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, stripped
$ file /usr/lib/debug/usr/bin/perl
/usr/lib/debug/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter *empty*, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, not stripped

file当它报告解释器是空的时,究竟是在告诉我什么?

dynamic-linking exec
  • 2 个回答
  • 4888 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve