2017-09-21 68 views
1

SSH.NETを使用してUnixボックスでシェルスクリプトを呼び出すWebサービスがあります。SSH.NETで実行されたコマンド(.4gl)SshClient.RunCommandが "No such file or directory"で失敗する

スクリプトを正常に実行すると正常に動作し、Informix DB上で正常に動作します。

ちょっとした背景:
.4glを実行するスクリプトを呼び出します(これはビジネス知識として表示されません)。

私はSSH.NETでそれを実行すると、バックログに次のエラーを与えているG4L:

fglgo:共有ライブラリをロード中にエラーが:libiffgisql.so:共有オブジェクトファイルを開くことができません:いいえそのようなファイルやディレクトリ
FILE_LOAD終了:2017年9月21日15時37分01秒

C#コードがSSH.NETスクリプトを実行するために

sshclients = new SshClient(p, 22, username, password); 
sshclients.Connect(); 
sshclients.KeepAliveInterval = new TimeSpan(0, 0, 1); 
sshclients.RunCommand("sh " + Script_dir); 

KeepAliveIntervalを追加しました。

私の質問はUnix/4glからのエラーです。
なぜこのようなことが起こり、スクリプトを正しく実行させることができますか?

答えて

0

SshClient.RunCommandはSSH「exec」チャネルを内部的に使用します。デフォルトでは(正しく)セッションに擬似端末(PTY)が割り当てられません。結果として、起動スクリプトの別のセットがソースされることがあります。そして/またはスクリプト内の異なるブランチは、TERM環境変数の有無に基づいて行われます。したがって、環境は対話セッションとは異なる場合があります。SSHクライアントで使用します。

あなたのケースでは、PATHの設定が異なる可能性があります。その結果、実行可能ファイルairが見つかりません。

これが原因であることを確認するには、SSHクライアントで擬似端末の割り当てを無効にします。たとえば、PuTTYの場合は、の接続> SSH> TTY>疑似端末を割り当てないでください。次に、接続> SSH>リモートコマンドに行き、air ...コマンドを入力します。 セッション>終了時にウィンドウを閉じる>絶対にをチェックし、セッションを開きます。あなたは同じ"空気が見つかりません"エラーを取得する必要があります。優先順位で、この問題を解決するために


方法:

  1. 特定の環境に依存しないようにスクリプトを修正してください。

  2. 起動スクリプトを修正して、対話セッションと非対話セッションの両方でPATHを同じに設定します。

  3. コマンド自体が特定の環境設定に依存していて、起動スクリプトを修正できない場合は、コマンド自体の環境を変更できます。その構文は、リモートシステムおよび/またはシェルによって異なります。共通* nixシステムでは、この作品:

    sshclients.RunCommand("PATH=\"$PATH;/path/to/g4l\" && sh ..."); 
    
  4. 別の(推奨しない)アプローチ「EXEC」チャネルについて擬似端末の割り当てを強制することです。

    SSH.NETではこれをサポートしていませんが、 実装のコードの問題SendPseudoTerminalRequestの要求を修正する必要があります(これはテストしませんでした)。

    .CreateShell methodを使用して「シェル」チャネルを使用することもできます。そのために、SSH.NETは擬似端末割り当てをサポートしています。

    ただし、コマンド実行を自動化するために擬似端末を使用すると、厄介な副作用が発生する可能性があります。

    0を参照して、例えば同様の問題についてはIs there a simple way to get rid of junk values that come when you SSH using Python's Paramiko library and fetch output from CLI of a remote machine?


を参照してください。

+0

ありがとう、マーティン。ポイント3は問題を解決しました。このスクリプトは、 'CREDIT_LOAD_DIR'という別のディレクトリのファイルを介してやりとりします.2de環境設定を追加しようとしました。 私はこれを追加しました: SshCommand SC = sshclients.CreateCommand( "PATH = \" $のPATH; // USR/DIR \ " "+ " && CREDIT_LOAD_DIR = \ "$ CREDIT_LOAD_DIR; // USR/DIR" + " && sh "+ Script_dir); しかし、スクリプトは実行されていません –

+0

コマンドの中に複数の環境設定を追加することはできますか? –

+0

1回目のコメントで私は自動修正を受け取ってファイルを反復します –

0

Informix-4gl開発者がFourJs Generoに移行し、Webサービス機能を使用しているときに同様の質問が表示されました。私が彼らに言いたいのは、「Genero Application Serverが立ち上げたfglgo/fglrunプロセスを誰が所有しているのか、どこから実行しているのか、その環境は何か」です。必要ならば、私は単純なプログラムで説明しましょう。

MAIN 
    RUN "env > /tmp/myname.txt" 
    RUN "who >> /tmp/myname.txt" 
    RUN "pwd >> /tmp/myname.txt" 
END MAIN 

...と言って、プログラムがコマンドラインから実行しているときと比較してください。これは通常、4glプログラムが実行される前に環境が正しく設定されるように、構成の初期の答えのような場合です。

関連する問題