【问题标题】:What's wrong with my deploy script?我的部署脚本有什么问题?
【发布时间】:2012-12-24 17:14:33
【问题描述】:

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

  1. SSH 到远程服务器
  2. 根据提供的参数运行git pull 命令

目前我有这个:

#!/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 命令,但是是什么导致了前两行?我是否配置错误,或者我在某处有语法错误?

【问题讨论】:

    标签: git shell ssh


    【解决方案1】:

    ssh 在这里要求输入密码:

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

    但是标准输入不是来自终端(tty),而是来自一个heredoc。所以它不能使用其标准的兼容 tty 的密码请求机制。

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

    【讨论】:

    • 如果我向远程机器上的授权用户添加 SSH 密钥以绕过密码输入,那么我的脚本是否可以工作?
    • 我强烈怀疑。另一种方法可能是使用 -t 选项
    • -t 标志有什么作用?
    • 我已设置基于密钥的身份验证,因此通过 SSH 连接时无需提供密码。但是,使用-t,尽管命令执行成功,我仍然收到伪终端错误。如何抑制该错误消息?
    【解决方案2】:

    不会分配伪终端,因为标准输入不是终端。

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

    sudo:对不起,你必须有一个 tty 才能运行 sudo

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 2014-06-29
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多