ssh foo@bar
カラーフォーマットを除いてSSHセッションを作成するには?唯一の要件は、設定をコマンドssh
で宣言する必要があり、設定ファイルで設定できないことです。
しかし、その理由は、SSHシェルの結果をScalaプログラムにインポートしたいからです。興味があれば、git reposで詳細を確認してください。。したがって、たとえば[03m
、カラーコード(および他のカラーコード)を削除する必要があります。リモートホストがいくつかの設定を行い、色がないとは期待できません。
修正する
SSHライブラリに関して
JSch
説明する必要があるいくつかの設定があります。setPtyType("dumb")
、dumb
シミュレートされた端末セッションのパラメータ設定は次のようになります。エミュレートされた端末結果にはカラーコードは含まれません。このプロパティを設定したら、印刷を使用します。dumb
Linux
VT100
dumb
echo $TERM
dumb
setPty(bool enable)
デフォルトは yesfalse
ですが、明示的に設定するとsetPty(false)
結果が壊れます。残念ながら、実行時にpty値を取得するAPIが見つからず、Java用の事実上標準のSSHライブラリであるにもかかわらず、ライブラリにドキュメントが不足しています。
SSH内でSSHを使用したいのはなぜですか?
- 一部の重要なファイルがリモートホストにある可能性があるため、この機能が必要です。したがって、まずリモートホストにログインしてから、別のホストにログインする必要があります。
- 端末にログインし、SSH を使用して他のホストに接続するのは正常な動作です。
Scalaライブラリにカラーコードがある場合、出力は何ですか?
スピード:JSch
SSHセッション接続を作成するために使用されます。- 使用
ls
- 新しいハウジングに接続
cd /var
新しいケースに使用ls
新しいケースに使用してください。
//use `JSch` create a ssh session connection.
val shell = new Shell(Auth("hostname", "username", 22, "pwd"))
//use `ls`
shell.exc("ls")
//connect to new shell
val newShell = shell.newShell(Auth("xxx.xxx.xxx.xxx", "root", 22, "pwd")).right.get
//use `cd /var` on the new shell
newShell.exc("cd /var")
//use `ls` on the new shell.
newShell.exc("ls")
newShell.exit()
shell.disconnect()
属性をshell.exc("ls")
使用しているため、コマンドは完全に出力されます。カラーコードを印刷しません。 dumb
JSch.setPtyType()
カラーコードに問題が発生し、newShell.exc("ls")
次のように印刷されます。
[0m[01;34mbackups[0m [01;34mcache[0m [01;34mlib[0m [01;34mlocal[0m [01;36mlock[0m [01;34mlog[0m [01;34mmail[0m [01;34mopt[0m [01;36mrun[0m [01;34mspool[0m [30;42mtmp[0m
明らかに、これにはいくつかのカラーコードが含まれています。 val newShell
ベアコマンドによって生成されるため、同じ方法ではありませんssh -t -o StrictHostKeyChecking=no foo@bar
。JSch
今、私はカラーコードを処理し、応答情報をテキストとしてのみ保持したいと思います。
backups cache lib local lock log mail opt run spool tmp
問題が明確になることを願っています。もう一度ありがとうございます。
再アップデート
私の2つの間違いについて申し訳ありません。
TERM=dumb
JSch
設定を使用すると、dumb
新しいSSHがこれをだますので、まったく必要ありません。setPty(true)
(または-Tパラメータ)が影響を受け、テストが失敗します。もう1つの問題は、定数がMAGIC_SPLIT
このモード\n
ではなくそのモードで開始/終了する必要があることです\r\n
。
どのような変更が必要ですか?
これはよりきれいな応答であるため、-Tパラメータを含めて使用するsetPty(true)
すべてのメッセージプロトコルに使用されます。JSch
ssh
dumb
どんな質問がありましたか?
一部のリモートホストは、stdin: is not a tty
ログインが成功した後にエラーメッセージで応答します。リモートホストがecho $?
失敗するためです。しかし、これはすでに要点を超えています。
このトピックについて
質問に戻り、how to use ssh session with no color formatting?
答えは-T
にパラメータを使用することですssh
。
最後に、@sourcejediの忍耐に感謝します。
ベストアンサー1
ただします。
出力が別のプログラムにパイプされるローカルプログラムは、端末に接続されていないことを検出する必要があるため、カラーコードは使用できません(色コードは端末によって異なるため、TERM環境変数が必要です)。
ローカルプログラムがssh
別のプログラムにパイプされてoptionsを渡さない場合は、-tt
「疑似ターミナル」の割り当てを抑制し、代わりにパイプを使用します。また、見ることができますman ssh
。
コードが出力をキャプチャするためにパイプを使用するのではなく、「疑似端末」を割り当てる場合会議これに注意する必要があります。ほとんどの場合、必要なコードはパイプを使用するよりもあいまいで長く、ほとんどの場合、PTYの追加機能は必要ありません。
あなたの質問が間違っていると思わない限り(更新セクションで)
実際に実行していないと仮定しますssh
が、代わりにsshpass -p '${auth.password}' ssh
...
そのページによると、sshpassはman
「専用のTTYでsshを実行して対話型ユーザーからパスワードを取得すると思うように欺いています」(たとえば、別のPTYです)。
この場合、内部SSH接続の一般的な端末動作を再度無効にする必要があります。それはssh -T
(ssh -t
コードコミットの1つとは異なり!)を使用しています。
私はプレフィックスwithがTERM=dumb
非常に似た効果を得ることができると思います。回避策は次のとおりです。 ssh -T
TERMを台無しにする必要はありません。しかし、TERM=dumb sshpass sh -c 'echo $TERM'
私のコンピュータでテストした結果、合格したようです。たぶんもっと簡単だと思うかもしれません。
次の質問:テストでコードが必要なときにこれが必要だと言うのはなぜですか?返品TERM=dumb
(内部)コマンドを開始する前にすでに設定を開始していますかssh
?あなたは彼らがssh
それを受け継いだと期待するでしょう TERM=dumb
。 Jschのコードを確認してください。setPtyType("dumb")
電話も受けないので、あまり影響がないようですsetPty(true)
。
私の理解は「壊れた」というあなたの主張と矛盾していますが、あなたはsetPty(false)
方法を話していません。