カラーフォーマットなしでSSHセッションを使用する方法

カラーフォーマットなしでSSHセッションを使用する方法

ssh foo@barカラーフォーマットを除いてSSHセッションを作成するには?唯一の要件は、設定をコマンドsshで宣言する必要があり、設定ファイルで設定できないことです。

しかし、その理由は、SSHシェルの結果をScalaプログラムにインポートしたいからです。興味があれば、git reposで詳細を確認してください。。したがって、たとえば[03m、カラーコード(および他のカラーコード)を削除する必要があります。リモートホストがいくつかの設定を行い、色がないとは期待できません。

修正する

  1. SSHライブラリに関してJSch説明する必要があるいくつかの設定があります。

    1. setPtyType("dumb")dumbシミュレートされた端末セッションのパラメータ設定は次のようになります。エミュレートされた端末結果にはカラーコードは含まれません。このプロパティを設定したら、印刷を使用します。dumbLinuxVT100dumbecho $TERMdumb
    2. setPty(bool enable)デフォルトは yesfalseですが、明示的に設定するとsetPty(false)結果が壊れます。残念ながら、実行時にpty値を取得するAPIが見つからず、Java用の事実上標準のSSHライブラリであるにもかかわらず、ライブラリにドキュメントが不足しています。
  2. SSH内でSSHを使用したいのはなぜですか?

    1. 一部の重要なファイルがリモートホストにある可能性があるため、この機能が必要です。したがって、まずリモートホストにログインしてから、別のホストにログインする必要があります。
    2. 端末にログインし、SSH を使用して他のホストに接続するのは正常な動作です。
  3. Scalaライブラリにカラーコードがある場合、出力は何ですか?
    スピード:

    • JSchSSHセッション接続を作成するために使用されます。
    • 使用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")使用しているため、コマンドは完全に出力されます。カラーコードを印刷しません。 dumbJSch.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@barJSch

今、私はカラーコードを処理し、応答情報をテキストとしてのみ保持したいと思います。

backups  cache  lib  local  lock  log  mail  opt  run  spool  tmp

問題が明確になることを願っています。もう一度ありがとうございます。

再アップデート

私の2つの間違いについて申し訳ありません。

  1. TERM=dumbJSch設定を使用すると、dumb新しいSSHがこれをだますので、まったく必要ありません。
  2. setPty(true)(または-Tパラメータ)が影響を受け、テストが失敗します。もう1つの問題は、定数がMAGIC_SPLITこのモード\nではなくそのモードで開始/終了する必要があることです\r\n

どのような変更が必要ですか?

これはよりきれいな応答であるため、-Tパラメータを含めて使用するsetPty(true)すべてのメッセージプロトコルに使用されます。JSchsshdumb

どんな質問がありましたか?

一部のリモートホストは、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 -Tssh -tコードコミットの1つとは異なり!)を使用しています。

私はプレフィックスwithがTERM=dumb非常に似た効果を得ることができると思います。回避策は次のとおりです。 ssh -TTERMを台無しにする必要はありません。しかし、TERM=dumb sshpass sh -c 'echo $TERM'私のコンピュータでテストした結果、合格したようです。たぶんもっと簡単だと思うかもしれません。

次の質問:テストでコードが必要なときにこれが必要だと言うのはなぜですか?返品TERM=dumb(内部)コマンドを開始する前にすでに設定を開始していますかssh?あなたは彼らがsshそれを受け継いだと期待するでしょう TERM=dumb。 Jschのコードを確認してください。setPtyType("dumb")電話も受けないので、あまり影響がないようですsetPty(true)

私の理解は「壊れた」というあなたの主張と矛盾していますが、あなたはsetPty(false)方法を話していません。

おすすめ記事