小编Bra*_*one的帖子

无法在脚本中将密码传递给 su

我正在编写构建脚本。这个脚本最后必须复制一个文件。该文件将放置在另一个用户的主目录中,并且该文件也必须属于该第二个用户。我的第一次尝试是像这样使用 su :

su fbgs -c "cp fbgs.jar /home/fbgs/server/plugins/"
Run Code Online (Sandbox Code Playgroud)

这在命令行中有效,但是当我将其放入脚本时,我需要自动输入密码。所以我尝试了以下命令:

echo Password | su -S fbgs -c "cp fbgs.jar /home/fbgs/server/plugins/"
Run Code Online (Sandbox Code Playgroud)

但是后来我得到了这个输出:

su: must be run from a terminal
Run Code Online (Sandbox Code Playgroud)

我如何让这个工作?

password su

6
推荐指数
1
解决办法
1万
查看次数

修改tar文件中的文件名而不将文件解压到临时位置

我有一个 tar 文件,其中包含名为 .tar 的文件夹中的一些文件old_name。现在我想创建一个新的 tar 文件,该文件夹已被重命名为,new_name而无需将文件解压缩到磁盘,因为这对于大型存档来说会显着变慢(磁盘读取和写入的两倍以上)。
我知道该怎么做:tar -xf old.tar; tar -cf new.tar --transform 's/old_name/new_name/' old_name

我尝试了几件事,但似乎都没有奏效:

  • tar -cOf old.tar | tar -xf new.tar --transform 's/old_name/new_name/'
  • cat old.tar | tar --delete --transform 's/old_name/new_name/' > new.tar
  • cat old.tar | tar -u --transform 's/old_name/new_name/' > new.tar

但似乎没有任何效果。

关闭我发现是这些:

但那些是关于删除 tarball 中的文件,而不是更改它们的路径。

command-line tar command

6
推荐指数
1
解决办法
602
查看次数

是否可以在 Debian 关机/重启时首先执行脚本?

我目前正在尝试注册一个脚本(位于 /etc/init.d 中),使该脚本在关机/重启时作为第一个脚本/程序执行(更改为运行级别 0 或 6)

我曾经update-rc.d stop_servers stop 0 0 6 .为这两个运行级别注册脚本。它在那里正确注册,但名称为K01stop_servers。这使得脚本不会作为第一个被执行。
我基本上需要一切仍在运行。这就是为什么我希望它是第一个。
也就是说,我仍然需要运行我的 apache、mysql 和 (s)ftp 服务器,并且我的 java 仍然功能齐全。

我如何实现这一目标?

脚本如下:

#! /bin/bash

### BEGIN INIT INFO
# Provides:          mc_server_safe_shutdown
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:
# Default-Stop:      0 6
# Description:       Shuts down all Minecraft serves softly
### END INIT INFO

/root/.stop_servers

exit 0
Run Code Online (Sandbox Code Playgroud)

shutdown debian init.d reboot bash-script

5
推荐指数
1
解决办法
5282
查看次数

创建所有已安装的 dpkg 软件的 JSON 文件

我正在尝试将通过 dpkg 安装的所有软件包收集在 JSON 文件中。

我尝试过这个脚本:

echo [ > installed_packages.json
dpkg-query -W -f '{"name":"${binary:Package}","version":"${Version}","short_description":"${binary:Summary}","description":"${Description}","author":"${Maintainer}","location":"${Filename}","status":{"want":"${db:Status-Want}","status":"${db:Status-Status}","eflag":"${db:Status-Eflag}"},"dependencies":"${Depends}","tags":"${Depends}"},\n' >> installed_packages.json
echo ] >> installed_packages.json
Run Code Online (Sandbox Code Playgroud)

尽管我很快注意到占位符未转义,并且某些字段(如依赖项)需要进行一些处理才能真正有用。

因此,我正在考虑使用命令获取一个简单的列表dpkg-query -W -f '${binary:Package}',然后对其进行迭代并单独处理每个字段。尽管我担心每个包有 10 次调用会对性能造成严重影响dpkg-query

那么我怎样才能以尽可能便携的方式实现这一目标呢?(该脚本最终将成为许多不同机器上的监视工具的一部分。随后将支持其他包管理器)。

编辑:

由于占位符似乎被设计为兼容 RFC 822(并且其他软件,例如apt-cache show <package>,无论如何都会生成符合 RFC 822 的输出),我认为sh将 RFC 822 转换为 JSON 的解决方案将是一个令人惊奇的解决方案。

编辑2:

我只是注意到这很好,但遗憾的是并没有使处理单个值变得更容易。

因此,像 RFC 822 那样正确转义变量或类似的东西将使一切正常工作。

编辑3:

重复调用dpkg-query绝对会降低性能。通过一次调用,脚本的运行时间远少于一秒。对每个包运行一次会使脚本在 100% CPU 情况下花费 30 秒以上。这是不能接受的...

dpkg text-processing package-management json

5
推荐指数
1
解决办法
2164
查看次数

使用 PuTTy 通过串行控制台切换 Debian 安装程序中的选项卡

我目前正在尝试在没有视频输出的系统上安装 Debian。我所拥有的只是串行控制台。
我知道如何启动它等等,甚至可以使用预先设定的配置自动安装它。安装本身绝对没有问题。

现在我还没弄清楚如何在安装程序具有的不同选项卡之间切换:

截屏

我很想拥有它,这样我就可以切换到日志并更详细地跟踪安装以进行调试(安装本身完全自动运行)。

我已经尝试过了

  • Alt+ 1-4
  • Alt+ F1-F4
  • Ctrl+ Alt+ 1-4
  • Ctrl+ Alt+ F1-F4

尽管这些都不起作用。其中之一很可能是正确的快捷方式,但 PuTTy 没有发送它们,因为 PuTTy 或 Windows 本身正在处理它(如Alt+ F4)。

keyboard-shortcuts debian putty serial-port debian-installer

5
推荐指数
1
解决办法
2299
查看次数

当网络服务器 (nginx) 在这些端口上运行时,在端口 80 或 443 上使用 SSH

我有一台远程 Linux (Debian) 机器,我想从一个非常受限的网络访问它。实际上,仅有的两个开放端口是端口 80(用于 HTTP)和 443(用于 HTTPS)。

在这台机器上,我有一个运行在端口 80 和 443 上的 nginx 服务器。

我以前没有做过这样的事情,并且对 nginx 以外的任何服务器软件都相当缺乏经验(和 Minecraft 这不是特别难做)。

如果有一种简单的方法可以实现这一点,请告诉我。

这台机器上的ssh服务器是这样的: OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e 11 Feb 2013

ssh debian port-forwarding nginx

4
推荐指数
1
解决办法
3181
查看次数

如何找出链接被重定向的位置

我目前正在开发一个更新文件的脚本。该文件有多个版本。重要的有静态链接。这些被重定向到实际文件,然后使用wget. 我发现wget有一个标志可以打印收到的标题。有一个位置列表。标题中的最后一个位置是实际的 URL。我需要得到那个!

我的想法是用来wget -S获取标题(我需要另一个标志来防止文件下载和创建)。然后使用管道解析行并捕获包含location. 我想这可以通过使用grep -l -i "location:" | tail -l. 然后我应该只剩下一行可以轻松解析的行。

所以命令看起来像这样:

# The -??? flag is the one that prevents the file from downloading. (I don't know it)
Location=$(wget -S -??? $URL | grep -l -i "location:" | tail -l)
Run Code Online (Sandbox Code Playgroud)

我的问题是我必须使用什么标志才能不下载文件,wget或者是否有另一种方法/命令来完成此操作?

shell-script wget http curl

3
推荐指数
1
解决办法
4933
查看次数