web-dev-qa-db-ja.com

SSH内のSSHが「stdin:is not tty」で失敗する

Sshでマシン1に接続してから、sshで別のマシン2に接続しようとしていますが、このエラーが発生します。

ssh [email protected] 'ssh [email protected]'

stdin: is not a tty

どうして?

62
Jhonathan

デフォルトでは、sshを使用してリモートマシンでコマンドを実行すると、リモートセッションに [〜#〜] tty [〜#〜] は割り当てられません。これにより、TTYの癖に対処することなく、バイナリデータなどを転送できます。これは、computeroneで実行されるコマンドに提供される環境です。

ただし、シェルコマンドを実行している可能性が高いため、リモートコマンドなしでsshを実行すると、TTYが割り当てられます。これはssh [email protected]コマンドで想定されていますが、前の説明のため、そのコマンドで使用できるTTYはありません。

computertwoでシェルが必要な場合は、代わりにこれを使用してください。これにより、リモート実行中にTTY割り当てが強制されます。

ssh -t [email protected] 'ssh [email protected]'

これは通常、sshチェーンの最後でシェルまたはその他の対話型プロセスを最終的に実行する場合に適しています。データを転送する場合、-tを追加することは適切でも必要でもありませんが、すべてのsshコマンドには、次のようなデータ生成または消費コマンドが含まれます。

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
73
mrb

SSHをリレーとして使用するより良い方法があります。ProxyCommandオプションを使用します。クライアントコンピューターには、2台目のコンピューターにログインできるキーが必要です(とにかく、ほとんどの状況でSSHを使用するには、公開キーが推奨される方法です)。これを~/.ssh/configに入れ、ssh computertwoを実行します。

Host computerone
HostName computerone.com
User user

Host computertwo
HostName computertwo.com
User otheruser
ProxyCommand ssh computerone exec nc %h %p

ncnetcat です。利用可能ないくつかのバージョンのいずれかで十分です。

中間サーバーのttyデバイスにインタラクティブ端末が必要です。

このコマンドを実行すると、機能するはずです。

ssh user@computer1 -t "ssh otheruser@computer2"

見る man ssh のために -tオプション。

7
roknir

これを解決するには、〜/ .ssh/configにあるssh構成ファイルにRequestTTY Yesを次のように追加します...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
3
John

SshでPROXY Jumpオプションを使用できます

-J [user@]Host[:port]
 Connect to the target Host by first making a ssh connection to the jump Host and then establishing a TCP forwarding to the ultimate destination from there.  Multiple jump Hops may be specified
 separated by comma characters.  This is a shortcut to specify a ProxyJump configuration directive.

したがって、hostBに接続する必要があるが、最初にhostAを経由する必要がある場合。通常私は

 ssh hostA
 [user@hostA ~]$ ssh hostB

私は今これをします

ssh -J hostA hostB
[user@hostB ~]$

,複数のホストを分離する

ssh -J hostA,hostB hostC
[user@hostC]

試すよりもはるかに簡単です-t sshコマンドを再実行します。

2
nelaaro

コマンドラインからSSH構成オプション「RequestTTY」を上書きできます。

私の作業例cd-serv-one.sh開始/bin/bash複数のコマンドを実行した後のSSHセッション:

#!/bin/bash

ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"

そして今、私は./cd-serv-one.sh必要なSSHセッションを開始します。

0
xorDiv