Fix: Pseudo-terminal tilldelas inte eftersom stdin inte är en terminal

I de flesta fall får du ett förvirrande "pseudo-terminal kommer inte att tilldelas eftersom stdin inte är en terminal" -fel endast när du kör någon form av SSH-kommando från ett skript. Om du kör samma kommando från kommandoraden kan det fungera helt bra.

Innan du går vidare, se till att du har lagt till din offentliga nyckel till SSH-agenten och försök sedan använda ssh igen. Du kanske bara saknat en nyckel. Å andra sidan, om detta inte fungerar måste du göra en liten felsökning i ditt skript.

Metod 1: Tvinga och inaktivera pseudo-tty-allokering

Det finns ett par kommandoradsalternativ som snabbt kan lösa problemet åt dig. Försök med ssh -t -t -R följt av resten av det du försökte ansluta till för att tvinga pseudo-terminalallokering. Låt oss till exempel säga att du skulle använda ssh -p 80 [email protected] för att logga in på ditt konto på example.com, vilket naturligtvis är en dummy för dokumentation som inte finns.

Försök att köra t.ex. ssh -t -t -R -p 80 [email protected] och se om det löser problemet. Du måste naturligtvis byta ut namnet med ditt faktiska konto och värdnamn för att kunna logga in på systemet. Detta tvingar tilldelningen av en terminal, så du borde inte se att pseudoterminalen inte kommer att tilldelas eftersom stdin inte är ett terminalfel.

Å andra sidan kan du bara sluta med en konstant rad felmeddelanden. Vissa användare har påpekat att detta kan anses vara underhållande.

Det är verkligen frustrerande men oavsett, så använd Ctrl + C för att döda processen.

Du kan försöka antingen bara använda en -t-omkopplare eller öka antalet. Om detta inte fungerar, ersätt sedan alla -t-omkopplare med en -T-omkopplare i kommandot, t.ex. ssh -T -R -p 80 [email protected] och se om det fungerar.

Den här metoden inaktiverar hela pseudoterminalallokeringsprocessen helt, så det kan fungera i fall där det inte tvingas. Naturligtvis borde inget av detta vara ett problem från kommandoraden, men se till att göra en anteckning när du hittar vilket alternativ som fungerar från ditt skript så att du kan använda det i framtida skript du måste köra för att komma åt nämnda server.

Eftersom kommandot ssh gav dessa två motsatta alternativ liknande namn, kom ihåg att -t tvingar tilldelningen av pseudo-terminaler medan -T inaktiverar det. Dessa alternativ är skiftlägeskänsliga, och de är ofta nödvändiga inifrån skript eftersom ssh behöver en traditionell TTY-terminal för att fungera. Naturligtvis skulle du i ditt fall använda din terminalemulator för detta ändamål.

Metod 2: Använda sshpass

Vissa människor kanske tycker att deras skript fungerar bättre med kommandot sshpass, som inte ingår som standard. Du kan alltid installera det med sudo apt-get install sshpass eller sudo yum install sshpass om du föredrar att prova eller för att du behöver det för ditt specifika användningsfall.

Om du inte redan använder det behöver du förmodligen inte det. Ändå kan du använda samma tekniker för att överraska felmeddelanden relaterade till pseudoterminalallokering också i denna typ av miljö.

Använd till exempel sshpass -p lösenord ssh -T [email protected] för att tvinga systemet att arbeta inifrån ditt skript.

Metod 3: Åtgärda jobbhanteringsfel

Ibland kan du få ett annat felmeddelande även efter att ha åtgärdat allt detta. Om du får en varning som läser ingen åtkomst till tty och du påminns om att det inte finns någon jobbkontroll i ditt skal ska du kunna arbeta något normalt.

Detta fel orsakas av att något är oregelbundet på fjärrservern relaterat till antingen csh, tcsh eller möjligen till och med Almquist eller annat skal. Du kanske inte har lagt märke till det för att du fick andra felmeddelanden, men förutsatt att du inte ser några andra om pseudo-terminaler borde det vara möjligt att fortsätta relativt som du brukar göra.

Du kanske inte vill försöka använda Ctrl + Z i det här fallet för att stoppa processer, eftersom det kanske inte finns något sätt att få dem att starta upp igen. Om du får ett felmeddelande som läser att det finns stoppade jobb när du avslutar får du inte logga ut.

Använd kommandona ps och kill för att stänga alla jobb du inte kan stänga, förutsatt att du inte har något emot att förlora arbete i processen. Du kan gå ut nu.

Taggar Linux-instruktioner ssh