2011-01-13 3 views
0

ターミナルスローCプログラムにいくつかのコマンドを渡し、その後にその入力を取得する必要があります。 その一部として、Expectスクリプトを配置する必要がある行があります。私は実行する必要がCでエスケープしているキャラクタ

FILE *command = popen("script here","r"); 

スクリプトは次のとおりです。

expect -c 'spawn ssh [email protected] cat /proc/stat 

expect { 
-re ".*yes/no.*" { 
send "yes\r" 
exp_continue 
} 
"password:" { 
send -- "password\r" 
} 
} 
interact' 

だから、私はスクリプトはそれを動作させる必要があるとして働いていたので、いくつかの文字をエスケープする必要があります。 私はエスケープの異なるシーケンスを試みましたが、それらのすべてが正しくありません。

ご協力いただきありがとうございます。

UPD:( ' "プログラムの浮遊、\ '" など "` *前構文エラー"')コンパイル中に、私はエラーを取得するエスケープせず

。 私はその問題が新しい行によって引き起こされたと思っていますが、単純に1行に書くだけではスクリプトは機能しません。私は\ nを使ってみましたが、これは私を助けませんでした。

だから、私は単にそれが最初

+1

なぜこのスクリプトの内容を正確にエスケープする必要がありますか?エスケープは、外部ファイルからデータを読み込むときではなく、文字列または文字リテラルをCソースノードに書き込むときにのみ必要です。 – templatetypedef

+0

試したエスケープ・シーケンスとその結果は何ですか? –

+0

エスケープしないと、コンパイル中にエラーが出ます( "* ''、" stray '\' in program "など)。私はその問題は新しい行に起因すると思うが、スクリプトを1行に書くだけではうまくいきません。私は\ nを使ってみましたが、これは私を助けませんでした。 私は単純にスクリプトをCファイルにコピー&ペーストすることはできません。何らかの処理が必要です – George

答えて

2

まず物事いくつかの処理を必要とする、Cのファイルにコピー&ペーストスクリプトすることはできません、Cの文字列化では、あなたが目に複数行・列を簡単にすることができます:

char *script = "expect -c 'spawn ssh [email protected] cat /proc/stat\n\n" 
       "expect {\n" 
       "-re \".*yes/no.*\"\n" 
       "send \"yes\\r\"\n" 
       ... 

コンパイラは、あなたのためにすべてのそれらの文字列を喜んで破ります。期待\\rは、コンパイル時に文字列に\rになっている間に\nは、コンパイル時に文字列内の改行文字に変換され、もちろん

注意、うまくいけば、実行時にキャリッジリターンになりつつあります。

2番目のことは、実行可能プログラムにexpectスクリプトを埋め込むのが正しい方法でしょうか?おそらくあなたがログインしているホストが途中で変わるでしょう。スクリプトを置き換えるのは、実行可能ファイルとは別のものに分かれている方がずっと簡単です。 (私は自分の人生で書かれたpppdチャットスクリプトの何百も何も言えませんが、仕事をするためにpppdを再コンパイルする必要はありませんでした!)

+0

+1悪い考え方です。 –

+0

ありがとう!あなたのアドバイスはとても役に立ちました。 埋め込みについて - 私の場合は悪くありません。すべての依存関係、アドレスなどはハードコードされており、すべてのシステムは1つの全体として機能します。アドレス、パスワードのユーザー名は決して変更されません。 – George

1

ハードコーディング

const char script[] = 
    "expect -c 'spawn ssh [email protected] cat /proc/stat\n" 
    "expect { -re \".*yes/no.*\" { send \"yes\\r\" exp_continue }\n" 
    "    \"password:\" { send -- \"password\\r\" }\n" 
    "  }\n" 
    "interact'\n" 

お知らせは、私はまた、Cの改行のエスケープを持つ行を終了しました...埋め込まれた二重引用符やバックスラッシュをエスケープ意味:あなたのCプログラムで「スクリプト」は、あなたがC規則に従う必要がありますコード '\ n'

関連する問題