如何在 Linux 启动时拉取 git 存储库

如何在 Linux 启动时拉取 git 存储库

我希望实验室中有一台 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/localrepoWorkingDirectory=%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

相关内容