我正在尝试创建一个 shell 脚本,其中包括启动 ssh-agent 并向代理添加私钥。例子:
#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...
Run Code Online (Sandbox Code Playgroud)
问题在于 ssh-agent 显然启动了 $SHELL 的另一个实例(在我的情况下是 bash),从脚本的角度来看,它执行了所有内容,而 ssh-add 及其下面的任何内容都不会运行。
如何从我的 shell 脚本运行 ssh-agent 并让它在命令列表中继续移动?
这是基于这里的这个恶作剧问题。所描述的问题是有一个 bash 脚本,其中包含以下内容:
rm -rf {pattern1}/{pattern2}
Run Code Online (Sandbox Code Playgroud)
...如果两种模式都包含一个或多个空元素rm -rf /,则假设原始命令被正确转录并且 OP 正在进行大括号扩展而不是参数扩展,则将扩展为至少一个实例。
命令 [...] 是无害的,但似乎几乎没有人注意到。
Ansible 工具可以防止这些错误,[...] 但是 [...] 似乎没有人知道这一点,否则他们就会知道我所描述的不会发生。
因此,假设您有一个rm -rf /通过大括号扩展或参数扩展发出命令的 shell 脚本,使用Ansible是否会阻止该命令被执行,如果是这样,它是如何做到的?
rm -rf /只要您使用 Ansible 来执行,以 root 权限执行是否真的“无害”?
我想检索当前执行的脚本文件的绝对文件名。链接也应该解决。
在 Linux 上,这似乎是这样完成的:
$(readlink -mn "$0")
Run Code Online (Sandbox Code Playgroud)
但readlink似乎工作非常不同的Mac OS X上
我读过这是使用
$(realpath $0)
Run Code Online (Sandbox Code Playgroud)
在 BSD 中,但这也不起作用。Mac OS X 没有realpath.
任何的想法?
bash 命令末尾的“ &&”、“ \” 和“ -” 是什么意思?
特别是,我遇到了以下应该将公钥添加到 Ubuntu 的 aptitude 包管理器的行组合,这些字符在这里用于什么?
gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075 | sudo apt-key 添加 - && \
sudo apt-get 更新
我在 Ubuntu 服务器上运行了多个屏幕,这些屏幕启动为:
screen -dmS screen1 cmd
screen -dmS screen2 cmd
etc...
Run Code Online (Sandbox Code Playgroud)
我需要杀死一个屏幕,但不是全部。用其名称杀死单个特定屏幕的正确命令是什么?我已经阅读了手册页,但似乎找不到我正在寻找的命令。
此外,我想将此命令写入 bash 脚本中,因此我不能像往常一样简单地screen -r screen1按Ctrl+ X。
这是这个问题的后续。
我还进行了一些测试;看起来这是在物理控制台上完成还是通过 SSH 完成并不重要,这也不仅仅发生在 SCP 上;我也用cat /dev/zero > /dev/null. 行为完全相同:
&(或者在它开始使用后把它放在后台使用CTRL-Zand bg);这是在不使用nohup.init.如果发送,我可以确认 SCP 和 CAT 都立即退出SIGHUP;我使用kill -HUP.
因此,看起来 SIGHUP 确实不会在注销时发送,至少不会发送到后台进程(由于显而易见的原因,无法使用前台进程进行测试)。
这发生在我最初使用 VMware ESX 3.5(基于 RedHat)的服务控制台时,但我能够在 CentOS 5.4 上完全复制它。
问题再次出现:是否应该在注销时将 SIGHUP 发送到进程,即使它们在后台运行?为什么这没有发生?
strace根据凯尔的回答,我检查了。
正如我所期望的那样,从启动它的 shell 注销时,该进程没有收到任何信号。在使用服务器的控制台和通过 SSH 时都会发生这种情况。
如何在 bash 脚本中实现ctrl+c处理,从而中断脚本,以及脚本启动的当前正在运行的命令?
(想象一下,有一个脚本可以执行一些长时间运行的命令。用户点击ctrl+c并中断命令,但脚本继续运行。)我需要它的行为方式使他们都被杀死。
我正在编写脚本来自动设置新的 slicehost 安装。在一个完美的世界中,在我启动脚本后,它会运行,而不会引起我的注意。我成功了,只有一个例外。
我如何设置时区,永久(重新启动后幸存)和理智(调整标准和夏令时,所以不只是强制日期)......不需要我输入的方式?
目前,我正在使用
dpkg-reconfigure tzdata
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何方法可以强制参数进入它。它需要用户输入。
编辑:我在这里编辑,而不是评论,因为评论似乎不允许代码块。
这是我最终得到的实际代码,基于下面 Rudedog 的评论。我还注意到这不会更新 /etc/timezone.conf 。我不确定谁在使用它,但如果有人使用它,我也会设置它。
TIMEZONE="America/Los_Angeles"
echo $TIMEZONE > /etc/timezone
cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime # This sets the time
Run Code Online (Sandbox Code Playgroud) ...类似于 /dev/null 的东西,但只是阻止写入它的所有字节?
我需要的是通过阻止其输出将任意可执行文件保存在内存中的技巧。管道似乎不可用,因为输出首先写入缓冲区。