我使用nginx作为反向代理,我有 2 条规则,例如:
location ~ ^/indirect {
rewrite ^/indirect(.*) /foobar$1;
}
location ~ ^/foobar {
set $url http://example.com/something/index.php?var1=hello&access=$scheme://$host$uri;
proxy_pass $url;
}
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,我将$uri
变量作为参数传递给代理页面(该$uri
变量是 nginx 的,请参阅http core module
文档)。
问题是,如果我访问http://example.com/foobar/hello%20world
,该$uri
变量包含 /foobar/hello world
(如您所见,%20
已被其 url 解码值替换,一个空格)。然后,nginx 在执行 proxy_pass 行(未联系后端)之前返回 http 状态代码 400(错误请求)。
还有可用的变量$request_uri
,它保存客户端发出的原始请求 URI,因此在这种情况下,它将保存正确的值和%20
序列。但是我不能使用它,因为如果客户端通过/indirect
路径,$request_uri
将包含/indirect/...
而我希望access
传递给后端的参数始终为/foobar/...
。
有多个indirect
类似规则(这是针对 DAV/calDAV/cardDAV 服务器,并且有多个客户端连接到多个路径,所以我需要这些类似indirect
规则),所以在proxy_pass
那里做是不可行的,并且有直接进入/foobar
路径的客户端。
那么有没有什么方法可以 …
在/bin/sh
and /bin/bash
(我猜还有很多其他 shell)中,当脚本中的任何命令行退出时的状态代码不是 0 时,启动脚本#!/bin/sh -e
(或set -e
在脚本中的某个地方执行)会导致脚本中止。
是否有任何等效或解决方法可以在 perl 脚本中获得相同的行为?(即,如果任何指令产生错误,或者如果使用system(...)
或反引号执行的任何外部命令返回错误代码,则立即退出)
我知道我可以fstab
通过放置它们的路径(如/dev/sda1
或/dev/mapper/myvg-logicalVolume1
)或通过 fs 标签 ( LABEL=root
) 或 UUID ( UUID=1234-5678-...
)来指定挂载。
我看到使用 UUID 的“经典”分区在可靠性方面有明显优势,例如/dev/sda1
,因为如果您重新分区驱动器/更多分区/添加更多磁盘,那么您的某些分区现在可能会被识别为另一个名称,尽管通过 UUID 挂载更难分辨您的数据存储在哪个分区/LV。
但是使用LVM
,我的胆量告诉我 LVM 系统本身管理他们的磁盘/分区的发现,如果某些 PV(在使用分区/磁盘之后)现在命名不同并不重要。因此,通过 UUID 或使用类似的路径安装不会有任何区别(说到可靠性)/dev/mapper/vg-lv
,后者更清晰。
这样对吗?
我正在制作一个在内部执行一些命令的脚本,这些命令显示一些输出STDOUT
(STDERR
以及,但这没问题)。我需要我的脚本生成一个 .tar.gz 文件到STDOUT
,所以脚本中执行的一些命令的输出也会转到STDOUT
,这以输出中无效的 .tar.gz 文件结束。
因此,简而言之,可以将第一个命令输出到屏幕(因为我仍然想看到输出)但不能通过STDOUT
? 此外,我想保持STDERR
原样,以便那里只显示错误消息。
我的意思的一个简单例子。这将是我的脚本:
#!/bin/bash
# the output of these commands shouldn't go to STDOUT, but still appear on screen
some_cmd foo bar
other_cmd baz
#the following command creates a tar.gz of the "whatever" folder,
#and outputs the result to STDOUT
tar zc whatever/
Run Code Online (Sandbox Code Playgroud)
我试过搞乱exec
文件描述符,但我仍然无法让它工作:
#!/bin/bash
# save STDOUT to #3
exec 3>&1
# the output of these commands should go to …
Run Code Online (Sandbox Code Playgroud) 我有几台服务器,其中有一些客户端的应用程序,我希望为客户端提供一个应用程序以查看服务器和应用程序状态,并能够重新启动某些服务。
我已经完成了它的主要部分,用自定义 shell 脚本替换了 ssh 用户的登录 shell,该脚本为他提供了一个带有一些选项的菜单。登录后会自动用sudo
(with NOPASSWD
)启动菜单,因为脚本需要重新启动系统服务。问题是,我想他查看的输出top
或htop
,但我不希望他能够杀死或renice只能过程,也许其他的东西,都top
和htop
许可证。我只是想让他查看top
.
是否有任何选项、标志或等效命令?