我的部署脚本出了什么问题?

时间:2013-01-10 10:35:14

标签: git shell ssh

我正在尝试使用我可以从本地计算机运行的shell脚本来自动化我的部署过程。这个过程很简单:

  1. SSH到远程服务器
  2. 根据提供的参数运行git pull命令
  3. 目前我有这个:

    #!/bin/sh
    
    SSH_HOST="REMOVED"
    SSH_PORT="REMOVED"
    SSH_USER="REMOVE"
    
    if [ "$1" = "live" ]
        then
        DIR="REMOVED"
        GIT_BRANCH="REMOVED"
        echo "Deploying to live site..."
    elif [ "$1" = "test" ]
        then
        DIR="REMOVED"
        GIT_BRANCH="REMOVED"
        echo "Deploying to test site..."
    else
        echo "ERROR: Please specify a target (either live or test)"
        exit 1;
    fi
    
    # create SSH connection
    echo "ssh $SSH_USER@$SSH_HOST -p $SSH_PORT"
    ssh $SSH_USER@$SSH_HOST -p $SSH_PORT << END_SSH
    sudo -s
    cd $DIR
    git pull origin $GIT_BRANCH
    END_SSH
    
    echo "Site successfully deployed."
    exit 0;
    

    但是当我运行脚本时,我收到以下消息:

      

    由于stdin不是终端,因此不会分配伪终端   sudo:对不起,你必须有一个tty来运行sudo
      错误:无法打开.git / FETCH_HEAD:权限被拒绝

    我哪里出错了?最后一行只是因为我没有在远程服务器上成功验证为sudo,因此由于权限错误而无法运行Git命令,但导致前两行的原因是什么?我是否错误配置了某些内容,或者我在某处或某处出现语法错误?

2 个答案:

答案 0 :(得分:1)

ssh在这里要求输入密码:

ssh $SSH_USER@$SSH_HOST -p $SSH_PORT << END_SSH

但是stdin不是来自终端(tty),而是来自heredoc。因此它无法使用其标准的tty兼容密码请求机制。

如果您的远程计算机配置了您的公钥,那么您可能会避免这种情况。另一个选择是调查-t选项(强制伪tty分配)

答案 1 :(得分:0)

  

由于stdin不是终端,因此不会分配伪终端。

这是正常行为,因为您已使用<<重定向标准输入。

  

sudo:抱歉,你必须有一个tty来运行sudo

这是之前行为的直接结果,因为sudo希望真正的用户坐在交互式终端上。

我认为你真的不需要交互式会话,只需要ssh作为你真正想要运行命令的用户,并以shell命令作为参数调用ssh,或者更好,在服务器上创建一个脚本从非交互式ssh调用中运行它。