我正在尝试使用我可以从本地计算机运行的shell脚本来自动化我的部署过程。这个过程很简单:
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命令,但导致前两行的原因是什么?我是否错误配置了某些内容,或者我在某处或某处出现语法错误?
答案 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调用中运行它。