我正在编写构建脚本。这个脚本最后必须复制一个文件。该文件将放置在另一个用户的主目录中,并且该文件也必须属于该第二个用户。我的第一次尝试是像这样使用 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)
我如何让这个工作?
我有一个 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.tarcat old.tar | tar -u --transform 's/old_name/new_name/' > new.tar但似乎没有任何效果。
关闭我发现是这些:
但那些是关于删除 tarball 中的文件,而不是更改它们的路径。
我目前正在尝试注册一个脚本(位于 /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) 我正在尝试将通过 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 秒以上。这是不能接受的...
我目前正在尝试在没有视频输出的系统上安装 Debian。我所拥有的只是串行控制台。
我知道如何启动它等等,甚至可以使用预先设定的配置自动安装它。安装本身绝对没有问题。
现在我还没弄清楚如何在安装程序具有的不同选项卡之间切换:
我很想拥有它,这样我就可以切换到日志并更详细地跟踪安装以进行调试(安装本身完全自动运行)。
我已经尝试过了
尽管这些都不起作用。其中之一很可能是正确的快捷方式,但 PuTTy 没有发送它们,因为 PuTTy 或 Windows 本身正在处理它(如Alt+ F4)。
keyboard-shortcuts debian putty serial-port debian-installer
我有一台远程 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
我目前正在开发一个更新文件的脚本。该文件有多个版本。重要的有静态链接。这些被重定向到实际文件,然后使用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或者是否有另一种方法/命令来完成此操作?
debian ×3
bash-script ×1
command ×1
command-line ×1
curl ×1
dpkg ×1
http ×1
init.d ×1
json ×1
nginx ×1
password ×1
putty ×1
reboot ×1
serial-port ×1
shell-script ×1
shutdown ×1
ssh ×1
su ×1
tar ×1
wget ×1