Github Actions执行SSH报错:伪终端无法分配的原因与解决
问题:Github Runner连接SSH报错
pseudo-terminal will not be allocated because stdin is not a terminal 我尝试通过Github Runner连接SSH,但一直出现报错:pseudo-terminal will not be allocated because stdin is not a terminal。已经配置好私钥与known_hosts,且服务器未运行Docker,以下是我的Github Actions工作流配置:
name: deploy on: pull_request: branches: - master workflow_dispatch: inputs: environment: description: 'Dpeloy' type: string default: 'Deploy' required: true jobs: deploy: name: Deploy runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@master - name: Install SSH Key uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.SSH_PRIVATE_KEY }} known_hosts: 'just-a-placeholder-so-we-dont-get-errors' - name: Adding Known Hosts run: ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - name: Connect to server run: "ssh root@${{ secrets.SSH_HOST }}" - name: Test run: "cd /var/www/test"
报错原因
- 伪终端分配冲突:Github Actions的运行环境是非交互式的,默认SSH会尝试为会话分配伪终端(PTY),但这里的stdin不是终端设备,因此触发该警告。
- Workflow语法错误:
Connect to server和Test步骤缩进错误,被当成了独立的jobs而非deploy任务下的步骤;而且单独执行ssh命令会连接后立即退出,后续Test步骤是在Runner本地执行,根本不会在远程服务器上运行。
解决方案
- 给SSH命令加
-T参数,明确禁用伪终端分配,消除警告。 - 通过SSH一次性传递所有需要在远程执行的命令——因为每个
run步骤都是独立的,无法维持持续的SSH会话。 - 修正Workflow的缩进,确保所有步骤都归属
deploy任务。
修正后的Workflow配置
name: deploy on: pull_request: branches: - master workflow_dispatch: inputs: environment: description: 'Deploy' type: string default: 'Deploy' required: true jobs: deploy: name: Deploy runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@master - name: Install SSH Key uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.SSH_PRIVATE_KEY }} known_hosts: 'just-a-placeholder-so-we-dont-get-errors' - name: Adding Known Hosts run: ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - name: Connect to server and run commands run: | ssh -T root@${{ secrets.SSH_HOST }} << 'EOF' cd /var/www/test # 这里可以追加更多远程操作命令,比如拉取代码、重启服务等 EOF
内容的提问来源于stack exchange,提问作者Dan Rais
相关产品推荐
相关产品推荐

