gpt4 book ai didi

当脚本通过 Launchd 运行时,Git Push 不起作用

转载 作者:行者123 更新时间:2023-11-29 03:34:39 25 4
gpt4 key购买 nike

我编写了一个脚本来制作一个 mysqldump,将这个转储提交到我的本地 Git,然后将这个 Git 推送到我的 bitbucket 帐户。当我通过终端 (sh script.sh) 运行脚本时,脚本运行良好。我制作了一个 Plist 文件并添加了它,以便 Launchd 运行它。

Launchd 按计划在每晚凌晨 3 点准时运行它,并能很好地执行所有命令,除了将本地 Git 提交推送到 bitbucket。我究竟做错了什么?

正如您从我的脚本中看到的那样,我尝试添加大量日志记录,但我获得的日志记录仍然没有告诉我为什么推送不起作用,只是它不起作用。

所以我的问题有两个方面:

  1. 如何在通过 launchd 运行的脚本中将我的本地 Git 推送到 bitbucket?
  2. 我可以将什么添加到我的脚本(或其他地方),以便我可以从 launchd 或此脚本进行日志记录,以便我可以诊断出了什么问题?

我的脚本:

#!/bin/sh

exec 1> /Library/WebServer/Documents/backup/fulllog

# echo start message
echo $(date) "- Backup Script Processing" >> /Library/WebServer/Documents/backup/log

# navigate to backup dir
if
cd /Library/WebServer/Documents/backup/
then
echo $(date) "- Successfully navigated to backup dir" >> /Library/WebServer/Documents/backup/log
else
echo $(date) "- Could not locate backup directory" >> /Library/WebServer/Documents/backup/log
exit 0
fi

# echo message
echo $(date) "- Exporting SQL dump" >> /Library/WebServer/Documents/backup/log

if
#dump the db into a .sql file
/usr/local/mysql/bin/mysqldump --user=root --password=password --skip-extended-insert library > /Library/WebServer/Documents/backup/library.sql;
then
#echo success message
echo $(date) "- SQL dump successful" >> /Library/WebServer/Documents/backup/log
else
#echo error message
echo $(date) "- Mysqldump error" >> /Library/WebServer/Documents/backup/log
exit 0
fi

#add just created mysqldump to git
if
/usr/local/git/bin/git add library.sql
then
echo $(date) "- Backup successfully added to local Git staging" >> /Library/WebServer/Documents/backup/log
else
echo $(date) "- Error adding backup to local Git staging" >> /Library/WebServer/Documents/backup/log
exit 0
fi

if
/usr/local/git/bin/git add log
then
echo $(date) "- Log successfully added to local Git staging" >> /Library/WebServer/Documents/backup/log
else
echo $(date) "- Error adding log to local Git staging" >> /Library/WebServer/Documents/backup/log
exit 0
fi

if
/usr/local/git/bin/git commit -m 'Nightly SQL dump'
then
echo $(date) "- Backup successfully committed to local Git" >> /Library/WebServer/Documents/backup/log
else
echo $(date) "- Error committing backup to local Git" >> /Library/WebServer/Documents/backup/log
exit 0
fi

if
/usr/local/git/bin/git push origin master
then
echo $(date) "- Backup Git Commit successfully pushed to origin master" >> /Library/WebServer/Documents/backup/log
else
echo $(date) "- Backup Git Commit not pushed to origin master" >> /Library/WebServer/Documents/backup/log
fi

编辑添加:谢谢您的回答。我添加了环境变量 GIT_TRACE=1

你是对的,脚本中没有针对 Bitbucket 的身份验证,我在我的钥匙串(keychain)中使用我的用户名/密码组合推送 https。

我已经使用 Bitbucket instructions 设置了 SSH .我制作了一个 ssh.sh 脚本,看起来像这样(chmod +x):

#!/bin/sh
exec ssh -i "Users/sara/.ssh" "$@"

我已使用 export GIT_SSH =/Library/WebServer/Documents/scripts/ssh.sh 将此脚本添加为变量。

当我测试此设置以推送到 Bitbucket(使用终端)时,它可以正常工作,但出现错误,提示我的 SSH 目录或文件不存在。我假设它现在只能工作,因为 ssh-agent 已经在运行,并且它会因为通过 launchd 运行时出现“不存在”错误而失败。我尝试用“~/.ssh”引用位置,包括文件名,所有选项都给出相同的错误。

接下来我该做什么?如何引用我的关键位置以便找到它?

解决方法:最后我没有使用环境变量。

让它为我工作的解决方案是启用 SSH(我之前使用的是 HTTPS)。最后我加了

Host bitbucket.org
StrictHostKeyChecking no
IdentityFile /Users/sara/.ssh/id_rsa

到我的 ~/.ssh/config 文件,因为它一直要求我输入密码。我不想完全删除我的密码,但这使脚本能够工作。在清除了 Launchd 中的双重条目后(我的 plist 在 System 和 User 文件夹中)它终于在昨晚正确运行。

最佳答案

您可以设置环境变量 GIT_TRACE=1 让 git 显示它正在执行的命令以及出错的地方。

也就是说,此脚本中没有身份验证,所以我将继续并猜测这就是问题所在。很可能当您从 shell 运行脚本时,您的 ssh-agent 正在运行,其中包含您的 key 。通过 launchd 运行时,未设置代理,并且 key 不在默认文件之一中(或受密码保护)。

您可以通过将环境变量 GIT_SSH 指向包含如下内容的 shell 脚本包装器来解决此问题:

#!/bin/sh
exec ssh -i "path/to/my/unencrypted/ssh/key" "$@"

不要忘记 chmod +x 它。

关于当脚本通过 Launchd 运行时,Git Push 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com