You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

报错原因

  1. 伪终端分配冲突:Github Actions的运行环境是非交互式的,默认SSH会尝试为会话分配伪终端(PTY),但这里的stdin不是终端设备,因此触发该警告。
  2. Workflow语法错误:Connect to server和Test步骤缩进错误,被当成了独立的jobs而非deploy任务下的步骤;而且单独执行ssh命令会连接后立即退出,后续Test步骤是在Runner本地执行,根本不会在远程服务器上运行。

解决方案

  1. 给SSH命令加-T参数,明确禁用伪终端分配,消除警告。
  2. 通过SSH一次性传递所有需要在远程执行的命令——因为每个run步骤都是独立的,无法维持持续的SSH会话。
  3. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:10:23