0

我正在尝试使用可以从本地计算机运行的 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 命令,但是是什么导致了前两行?我是否配置错误,或者我在某处或某处有语法错误?

4

2 回答 2

1

ssh在这里要求输入密码:

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

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

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

于 2013-01-10T10:38:49.287 回答
0

不会分配伪终端,因为 stdin 不是终端。

这是正常行为,因为您已使用<<.

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

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

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

于 2013-01-10T10:39:58.717 回答