我尝试使用wget和下载文件,curl但因 403 错误(禁止)而被拒绝。
我可以在同一台机器上使用网络浏览器查看文件。
我再次尝试使用通过http://www.whatsmyuseragent.com获得的浏览器的用户代理。我这样做:
wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...
Run Code Online (Sandbox Code Playgroud)
和
curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...
Run Code Online (Sandbox Code Playgroud)
但它仍然被禁止。403 可能还有什么其他原因,我可以通过什么方式更改wget和curl命令来克服它们?
(这不是关于能够获取文件 - 我知道我可以从浏览器中保存它;这是关于理解为什么命令行工具的工作方式不同)
更新
感谢所有对这个问题的出色回答。我遇到的具体问题是服务器正在检查引用者。通过将其添加到命令行,我可以使用curl和获取文件wget。
检查引用者的服务器通过 302 跳转到另一个根本不执行检查的位置,因此该站点的curl或wget工作正常。
如果有人感兴趣,这是因为我正在阅读此页面以了解嵌入式 CSS,并试图以该站点的 css 为例。我遇到麻烦的实际 URL 是这个,curl我最终得到的是
curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css
Run Code Online (Sandbox Code Playgroud)
和 wget 是
wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css
Run Code Online (Sandbox Code Playgroud)
很有意思。
是否可以在交互式bash shell 中输入输出一些文本的命令,以便它出现在下一个命令提示符下,就好像用户在该提示符下输入了该文本一样?
我希望能够创建source一个脚本,该脚本将生成一个命令行并输出它,以便在脚本结束后提示返回时出现该脚本,以便用户可以在按下enter执行它之前选择对其进行编辑。
这可以通过xdotool但仅当终端在 X 窗口中并且安装时才有效。
[me@mybox] 100 $ xdotool type "ls -l"
[me@mybox] 101 $ ls -l <--- cursor appears here!
Run Code Online (Sandbox Code Playgroud)
这可以仅使用 bash 来完成吗?
一些 shell,如bash,支持进程替换,这是一种将进程输出呈现为文件的方法,如下所示:
$ diff <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)
但是,此构造不是POSIX,因此不可移植。如何处理替代的实现POSIX -友好的方式(即其中一个在工作/bin/sh)?
注意:问题不是问如何区分两个排序的文件——这只是一个人为的例子来演示进程替换!
我在 bash 变量中有两块 base64 数据。base64 数据中通常的换行符已被空格替换,变量基本上是一个非常长的单行字符串。
我可以解码变量中包含的两块 base64 数据,但在尝试执行此操作时遇到了一些细微差别。我想了解我是否正确地处理了这个问题,或者是否有更好的方法来解码不包含换行符的 base64 数据。这是我所拥有的:
第一个块是 350 个字符,我可以像这样成功解码它:
echo ${DATA::350} | openssl base64 -d | wc -c
256
Run Code Online (Sandbox Code Playgroud)
第二个块是 5745 个字符,但上面的命令没有产生预期的结果。IE:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Run Code Online (Sandbox Code Playgroud)
但是,如果我将换行符放回去,它会起作用:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Run Code Online (Sandbox Code Playgroud)
我希望第一个块足够小,可以避免一些行长度问题,并且它似乎是所使用的 base64 解码器的一个功能(两个常见的base64和openssl base64,表现不同)。
的base64解码器(代替openssl base64)停止在第一无效字符(空格),并因此只是解码而输出的OpenSSL 432个字符(9“线”)的第一个“行”(48个字节的输出数据)。该base64命令有一个选项可以忽略垃圾,所以这是有效的:
$ echo ${DATA:350} | base64 -d …Run Code Online (Sandbox Code Playgroud) 我有一个不使用子shell 调用命令替换的场景。我有一个这样的构造:
pushd $(mktemp -d)
Run Code Online (Sandbox Code Playgroud)
现在我想一次性退出并删除临时目录:
rmdir $(popd)
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为popd它不返回弹出的目录(它返回新的、现在是当前的目录),也因为它是在子shell 中执行的。
就像是
dirs -l -1 ; popd &> /dev/null
Run Code Online (Sandbox Code Playgroud)
将返回弹出的目录,但不能像这样使用:
rmdir $(dirs -l -1 ; popd &> /dev/null)
Run Code Online (Sandbox Code Playgroud)
因为popd只会影响子shell。需要的是能够做到这一点:
rmdir { dirs -l -1 ; popd &> /dev/null; }
Run Code Online (Sandbox Code Playgroud)
但这是无效的语法。有没有可能达到这个效果?
(注意:我知道我可以将临时目录保存在一个变量中;我试图避免这样做并在此过程中学习新的东西!)
考虑一个 100MB 的原始块设备作为一个简单的例子。即 204800 个块,每个块 512 字节,总共 102760448 字节。
挑战在于移动前 98MB(200704 个块),因此在它前面有 2MB(4096 个块)的间隙。就地执行此操作要求未向尚未读取的扇区写入任何内容。实现此目的的一种方法是引入缓冲区:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
Run Code Online (Sandbox Code Playgroud)
期望是mbuffer在将任何内容传递给写入器之前将存储 4096 个块,从而确保没有任何内容写入尚未读取的区域,并且写入器滞后读取器缓冲区的大小。缓冲区应该允许读取器和写入器在这些约束内尽可能快地操作。
但是,它似乎不能可靠地工作。我试过使用真实的设备,但它从来没有在它们上工作过,而对文件的实验在我的 64 位机器上有效,但在我的 32 位机器上无效。
首先,一些准备工作:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
Run Code Online (Sandbox Code Playgroud)
这不起作用:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 …Run Code Online (Sandbox Code Playgroud) 在 shell 提示符下输入时,以下socat命令行按预期工作:
# /usr/bin/socat UDP-RECV:4321 STDOUT
Run Code Online (Sandbox Code Playgroud)
它侦听 UDP 端口 4321 并将接收到的所有内容写入标准输出。
以下是尝试将此命令作为 systemd 服务启动,目的是将接收到的数据写入 systemd 日志(服务标准输出的默认目标):
# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT
Run Code Online (Sandbox Code Playgroud)
但是,启动此服务时,socat 会立即退出:
Process: 7425 ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT (code=exited, status=0/SUCCESS)
Run Code Online (Sandbox Code Playgroud)
研究问题(socat与 一起运行-d -d -d -d)表明它在标准输出上获得了 EOF:
N starting data transfer loop with FDs [5,5] and [1,1]
N socket 2 (fd 1) is at EOF
I close(5)
N exiting with status 0
Run Code Online (Sandbox Code Playgroud)
是否可以socat用作 systemd 服务?
Linux LVM 将UUID值分配给物理和逻辑卷,但它们不是有效的 RFC4122 UUID 字符串。下面是一个例子:
2185fe86-41d4-4311-9a47-8f0ebc7ecc5a RFC4122AZdHpq-uENw-cRo2-t6jS-iQXu-nD2u-woW7RT LVMLVM 格式更长,它的表示使用非十六进制字符,并以不同的方式连字符。
这种变化背后的基本原理是什么,为什么在严格来说不是规范的有效 UUID 时使用术语“UUID”?
也许 LVM 格式是另一种 UUID 标准格式,但我一直找不到任何暗示这一点的参考资料。
如果我找到disown一份工作bash并改变主意,我可以以某种方式撤消它吗?
如果是这样,更进一步,是否可以将任意流程置于作业控制之下(可接受的限制是我拥有该流程)?
最后,这是否会使以下工作流程成为可能:
^z后跟bg)jobs -p %+获取它的<pid>)screen或tmux会话,附加到它并将其用于以下步骤reptyr抢的作业(reptyr <pid>)<pid>到 shell 的作业控制(这可能吗?)^Z)除了最后两步,我什么都能做。停止作业^Z不起作用,因为该进程不在 shell 的作业列表中。
我的研究表明不可能拥有(反向disown)一个 pid 但希望我错了......
我有一个客户端与rsync 一起使用的备份服务器通过 SSH。服务器被配置为运行一个自定义的 shell 脚本,该脚本包装了 rsync 服务器端的调用。客户端不知道这一点,可以发出任何有效的 rsync 命令行。
我想将客户端的一些参数传递到该 shell 脚本中。就像是
$ rsync -av -customarg1 value1 -customarg2 value2 file1 file2 user@server
Run Code Online (Sandbox Code Playgroud)
客户端rsync拒绝任何它不知道的参数,就像ssh(via rsync -e) 一样。我想出的最好方法是将参数作为假的服务器端文件规范传递,脚本在执行它以启动 rsync 服务器之前从服务器端命令行中提取这些规范。即像这样的命令
$ rsync -av file1 file2 user@server:some/path\;customarg1=value1\;customarg2=value2
Run Code Online (Sandbox Code Playgroud)
将提供两个参数,然后表现得好像命令是
$ rsync -av file1 file2 user@server:some/path
Run Code Online (Sandbox Code Playgroud)
(这使用 SSH 设置许多环境变量的事实,包括$SSH_ORIGINAL_COMMAND其中包含 ssh 客户端发出的命令(即 rsync 客户端启动的 rsync 服务器命令),而不管 ssh 服务器配置为执行什么(即自定义 shell脚本))