我希望实验室中有一台 Kali Linux 2021(带有 zsh)机器,以便在启动时提取 git 存储库的最新副本。我可以让命令手动正常运行,但在我的一生中,我无法让它们在启动时运行。该存储库是一个不需要登录的公共存储库,下面是我正在运行的命令,它们会放弃任何更改并获取最新的文件:
/usr/bin/git -C /home/user/localrepo reset --hard main
/usr/bin/git -C /home/user/localrepo pull
我尝试将这些命令添加到.profile
、 ,在和.bash_login
中创建一个脚本,在从 crontab 重新启动时运行,但我已经不知道其他方法了。我真的不知道为什么它在启动时不起作用。/etc/network/if-up.d/script.sh
/etc/profile.d/
任何帮助是极大的赞赏。
[编辑] 我要补充的是,这是在虚拟实验室环境中运行的,该环境有一个网关,在 Kali VM 启动后大约 45 秒加载,所以这是我必须解决的一个问题。这可能就是脚本似乎没有运行的原因。为了解决这些评论,不,我没有收到任何错误,我检查了所谓的 git 日志,也没有看到任何内容。
答案1
您可以通过以下方式使用 systemd 来完成该任务:
# $HOME/.config/systemd/user/gitpull.service
[Unit]
Description=Pulling recent git repo
[Unit]
Type=oneshot
ExecStart=/usr/bin/git -C %h/localrepo reset --hard main
ExecStart=/usr/bin/git -C %h/localrepo pull
[Install]
WantedBy=default.target
然后测试一下:
$ systemctl --user start gitpull
如果您满意,则可以使用以下命令使其在登录时运行:
$ systemctl --user enable gitpull
笔记:
- 这使用
--user
总线而不是默认--system
总线。这是因为您希望它在用户登录时运行,而不是在计算机启动时运行。您还希望这些文件归用户所有(而不是root
)。不要systemctl
以 root 身份运行这些命令。 - 如果您确实想在总线上运行它
--system
,那么您需要添加User=
到该[Unit]
部分。 - 您将看到服务处于
activating
操作期间,然后dead
看到服务完成时。这就是 的本质,Type=oneshot
所以当您看到 时不要惊慌dead
。 WantedBy=default.target
意味着即使您的“登录”是通过 TTY 或 ssh 登录,此脚本也会运行。 LightDM 会触发这个,但其他事情也可以。如果您只想通过图形登录来触发此操作,请使用WantedBy=graphical-session.target
。%h
是用户主目录的缩写。- 你可以替换
-C %h/localrepo
为WorkingDirectory=%h/localrepo
答案2
我最终只是使用 LightDM GUI 中的 LightDM 会话和启动工具来将我的脚本设置为在登录时启动,并且运行良好。该脚本直到用户登录后才运行,这正是我想要的。我仍然不确定为什么它不能在正常的文件位置工作,但我怀疑 LightDM/Zsh 应该为此负责。
[编辑] 一个主要问题最终是脚本在虚拟环境的网关出现之前运行。我创建了一个包装器脚本来检查这一点,然后再运行其他脚本以从 GitHub 拉取。我可以将它们放在同一个脚本中,但我更喜欢使用包装器。
#/home/kali/bin/git-check.sh "<cmd to run>"
#!/bin/bash
# Give networking a chance to come up
printf "Waiting for Internet connectivity\n"
RESPONSE=0
while [ $RESPONSE != 2 ] && [ $RESPONSE != 3 ]
do
RESPONSE=$(curl -s --max-time 2 -I http://github.com | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')
case $RESPONSE in
[23]) printf "\nHTTP connectivity is up\n";;
5) printf "\nAccess denied or server error\n";;
*) printf "\nThe network is down or very slown\n";;
esac
done
$1