У меня есть php-скрипт, который работает на одном сервере, который включает команду exec() команды ssh на другой сервер. Эта команда ssh запускает скрипт, который включает команды git. Команды git в удаленном файле, выполняемые на удаленном сервере, по-видимому, влияют на сервер, создавший команду ssh, оставляя исходный сервер в неправильной ветке git.
Я создал два скрипта, чтобы минимально воспроизвести это. Первый скрипт git_ssh_bug_repro_1.php
выводит свое имя хоста и ветку git, затем запускает ssh-команду exec() второго скрипта на другом сервере (sudo ssh root@test-1 'php /path/git_ssh_bug_repro_2.php'
) и вывод print_r этого exec, а затем снова выводит свое имя хоста. и ветвь git позже. Второй сценарий также начинает с вывода имени хоста и текущей ветки, затем выполняет git checkout testing
, затем снова выводит имя хоста и ветку. Вывод этих двух сценариев, работающих вместе, как описано:
root@abc-1:/path# php git_ssh_bug_repro_1.php
BEFORE running ssh command:
COMMAND: git rev-parse --abbrev-ref HEAD
Hostname: abc-1, current git branch: master
COMMAND: sudo ssh root@test-1 'php /path/git_ssh_bug_repro_2.php'
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
Switched to branch 'testing'
OUTPUT:
Array
(
[0] => master
[1] => BEFORE running git checkout command:
[2] => COMMAND: git rev-parse --abbrev-ref HEAD
[3] => Hostname: test-1, current git branch: master
[4] => COMMAND: git checkout testing
[5] => OUTPUT:
[6] => Array
[7] => (
[8] => [0] => master
[9] => [1] => Your branch is ahead of 'origin/testing' by 21 commits.
[10] => )
[11] => AFTER running git checkout command:
[12] => COMMAND: git rev-parse --abbrev-ref HEAD
[13] => Hostname: test-1, current git branch: testing
)
AFTER running ssh command:
COMMAND: git rev-parse --abbrev-ref HEAD
Hostname: abc-1, current git branch: testing
root@abc-1:/path#
РЕЗЮМЕ: почему команды git, запускаемые скриптом на одном сервере, влияют на статус git другого сервера (в данном случае заставляя его переключиться на неправильную ветку) только потому, что указанный скрипт был отключился с другого сервера по ssh? И как я могу сделать так, чтобы ветка git исходного сервера не была изменена или иным образом подделана?