运行多个 ssh 命令

运行多个 ssh 命令

我在 bitbucket 中有一个运行多个 ssh 命令的命令,有没有办法在前一个命令完成后运行每个命令?

ssh <user>@<host> 'cd /<dir>/example.com; git clone https://<user>:<password>@bitbucket.org/<bucket>/examplegit.git -b develop; mv examplegit/* mv examplegit/.* .; rmdir examplegit;'
Cloning into 'examplegit'...
mv: cannot stat 'mv': No such file or directory
mv: cannot move 'examplegit/.' to './.': Device or resource busy
mv: cannot move 'examplegit/..' to './..': Device or resource busy
mv: cannot move 'examplegit/.git' to './.git': Directory not empty
rmdir: failed to remove 'examplegit': Directory not empty

我可以多次运行相同的命令,但会出现不同数量和顺序的错误。这很合理,因为它们都会立即执行,但并不总是可以执行。

能够一个接一个地运行将解决所有问题

答案1

有没有办法在前一个命令完成后运行每个命令?

事实上,它现在就是这样运作的。

如果你一直使用&分隔符,允许命令同时运行,但;分隔符总是等待退出前一个命令。

我可以多次运行相同的命令并得到不同数量和顺序的错误。

问题是你遗漏了一半的命令。具体来说,这部分:

mv examplegit/* mv examplegit/.* .;

可能是:

mv examplegit/*.;mv examplegit/.* .;

因为 'mv' 中途失败并留下一个非空目录,所以接下来的 'rmdir' 失败并且后续的 'git clone' 也拒绝克隆到该非空目录是有道理的。

总的来说,您还应该考虑;&&(替换所有&'s),它会额外检查前一个命令的退出代码,如果前一个命令失败,它就会停止。

ssh <user>@<host> 'cd /<dir>/example.com &&
    git clone https://<user>:<password>@bitbucket.org/<bucket>/examplegit.git -b develop &&
    mv examplegit/* . &&
    mv examplegit/.* . &&
    rmdir examplegit'

并考虑完全切换到不同的 git 部署方法这并不涉及制作一个新的克隆。

(您当前的方法还会使所有访问者都可以访问整个 Git 存储库 - 他们可能只需git clone https://example.com/.git下载您的所有私人源代码即可。)

例如:

  1. 克隆你的仓库到~/git/example.com 一次

  2. 要部署,请运行:

    ssh user@host 'cd ~/git/example.com &&
                   git pull --ff-only &&
                   GIT_WORK_TREE=/<dir>/example.com git checkout -f'
    

链接文章中的方法也将处理重命名/删除的文件,而您将永远保留旧文件。

相关内容