cd在Linux服务器的bash脚本中不起作用?

时间:2018-09-17 10:16:36

标签: linux bash macos

我有deploy.sh,这是内容。

#!/bin/bash

ssh root@202.119.36.10
cd ../var/www/myProject

我运行bash deploy.sh CD部分无法正常工作?这个想法是使部署自动化,现在我必须手动转到目录,执行git pull并重新启动节点服务器。

5 个答案:

答案 0 :(得分:1)

您的脚本的意思是:

  1. 登录到服务器。
  2. 注销后,在计算机上运行cd ../var/www/myProject命令。

您可以将所有命令放入Here document

#!/bin/bash

ssh root@202.119.36.10 <<EOF
cd /var/www/myProject
EOF

通常,如果我们切换到系统文件夹,例如/var/etc,则使用绝对路径。

或者,将要在服务器上执行的所有命令放在脚本文件中。

文件 deploy.sh 的内容:

cd /var/www/myProject

将此脚本复制到您的服务器,然后运行它:

scp deploy.sh root@202.119.36.10:
ssh root@202.119.36.10 bash deploy.sh

或通过here-document运行脚本

ssh root@202.119.36.10 bash < deploy.sh

答案 1 :(得分:0)

我认为去ssh到服务器(这是我之前做过的)是错误的主意

  

您可以运行CI / CD Environment,在您推动自己的操作时可以这样做   代码到服务器(GitLab等),它将触发您的bash   在您的保护程序(按您的配置)中,它将运行您的命令   最后部署您的产品。

在这里您可以了解更多信息:GitLab CI/CD

答案 2 :(得分:0)

cd命令将在本地计算机上运行,​​而不是在远程计算机上运行。

这里发生的是您正在打开ssh连接,然后脚本阻止等待该ssh连接的命令,而您从未发送过该命令。然后,当ssh命令返回时(再也不会发生),您将直接在计算机上执行cd

执行此操作的一种方法是拥有一个包含要在服务器上启动的命令的文件,并将其通过管道传递给ssh命令,就像这样。

ssh root@202.119.36.10 < commands

commands是一个包含例如

的文件
cd ../var/www/myProject

否则,您可以在远程计算机上安装commands并从本地计算机调用它(假设commands在远程计算机的root路径中)。

ssh root@202.119.36.10 'commands'

当然,这假设您正在以无密码方式登录到远程计算机(例如,使用ssl密钥文件)。

答案 3 :(得分:0)

#!/bin/bash

echo "deploying"
ssh root@202.119.36.10 'bash' < ./commands.sh

因此,您可以按照以下说明将所有命令放入commands.sh文件中

#!/bin/bash

set -e
cd ../var/www/myProject

答案 4 :(得分:0)

我已经解决了这个问题,这是我的脚本

#!/bin/bash

ssh root@server_ip << 'COMMAND'
cd ../var/www/myProject
git pull
npm i
pm2 restart server
COMMAND