通过ssh在远程服务器上自动执行git clone,并进行代理转发

时间:2015-02-13 15:52:23

标签: php git ssh phpseclib ssh-agent

我有一个使用ssh代理登录远程服务器的脚本。它试图克隆私人git存储库。但是,我无法让github接受登录。

<?php
$ssh_agent = new \phpseclib\System\SSH\Agent();
$connection = new \phpseclib\Net\SSH2('www.example.com');
$connection->login('example-username', $ssh_agent);

// the clone fails
$commands = array(
    'cd ~/example-path/',
    'ls -la',
    'git clone git@github.com:github-username/repo-name.git'
);
echo $connection->exec(implode('; ', $commands));

// this *does* work
$commands = array(
    'eval $(ssh-agent)',
    'ssh-add ~/.ssh/local-key-copied-on-the-server',
    'cd ~/example-path/',
    'ls -la',
    'git clone git@github.com:github-username/repo-name.git'
);
echo $connection->exec(implode('; ', $commands));

最后一个 工作。但它要求我在服务器上也有密钥,我宁愿阻止它。

当我手动执行此操作时,它可以正常工作。

$ ssh -A example-username@www.example.com
$ cd ~/example-path/
$ git clone git@github.com:github-username/repo-name.git

如果我跳过-A,则克隆失败是转发使其工作的。

在脚本中,我已经验证了:

  • 代理(由脚本使用)持有密钥(ssh-add -l列出它);
  • github接受通过部署密钥克隆特定的repo(这是我正在使用的密钥);
  • 我没有使用其他密钥登录,即我暂时从我的github帐户中删除了我的普通个人密钥;

但脚本可能没有使用转发。这是phpseclib的限制吗?我可以以使用转发的方式设置本地ssh代理吗?

0 个答案:

没有答案