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


58

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

ssh user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

どうして?


1
2番目の引用符の周りにこれらの単一引用符は必要ないと思いますssh
coffeMug

回答:


70

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

ただし、リモートコマンドなしでsshを実行すると、シェルセッションを実行している可能性が高いため、TTYが割り当てられます。これはssh otheruser@computertwo.comコマンドで予期されていますが、前述の説明のため、そのコマンドで使用できるTTYはありません。

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

ssh -t user@computerone.com 'ssh otheruser@computertwo.com'

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

ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'

9

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

Host computerone
HostName computerone.com
UserName user

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

ncあるnetcatを。利用可能ないくつかのバージョンのいずれかが行います。


computeroneの「authorized_keys」に「プロキシ」関連の行を追加する必要はありませんか?私はopenSSHの「プロキシ」機能を検討する意味を持ち続けていますが、まだそれを理解していません。
フェリペアルバレス14年

7

中間サーバーのttyデバイスに対話型端末が必要です。

このコマンドを試すと、うまくいくはずです:

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

オプションを参照man sshしてください-t


2

〜/ .ssh / configにあるssh configファイルにRequestTTY Yesを追加することでこれを解決しました...

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

1

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 ~]$

0

コマンドラインから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セッションを開始するために実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.