2011-11-07 6 views
8

私は、外部プロセスを開始して通信するために使用するC++クラスを持っています(QtのQProcessにいくらか似ています - 小さな組み込みシステムで作業しているのでQtを使用することはできません)。親プロセスと子プロセスの間のリンクを確立するためにpipeとdup2システムコールを使用します。問題は、ssh、scp、およびパスワードを要求する他のプログラムでは機能しません。私はsshをストライプしていて、/ dev/ttyを開き、何とかコマンドラインからパスワードを読むのに使っているようだ。私のクラスからパスワードを入力する方法や、appliactionがstdin以外のソースからの入力を期待していることを検出する方法はありますか(ポータブルである必要はありません)?C++でsshにパスワードをパイプするにはどうしたらいいですか?

+10

パスワードを送信したくないです。あなたがしたいのは、sshに〜/ .sshディレクトリの秘密鍵を読み込ませて利用させることです。 –

+0

公開鍵認証を使うか、askpassとssh-agentを見てください – sehe

+0

[sshpass](http://sourceforge.net/projects/sshpass /) – ephemient

答えて

7

sshプログラムでは、端末からパスワードを直接読み取るのが一般的です。擬似端末を割り当て、この擬似端末内でsshを実行して、このI/Oを捕捉する必要があります。 ptyマニュアルページ(セクション7、man 7 pty)は良い紹介です。

私は、通常はsshにパスワードを与えたくないということを改めて述べたいと思います。多くのより良い認証オプションがあります。ユーザー入力なしで実行する必要のあるプロセスに対しては、公開鍵認証を使用します。

+0

+1は公開鍵の提案です。他のものは、おそらくプログラムに平文パスワードを置きます(悪い)。 – jedwards

+0

あなたはおそらくセキュリティ上の欠陥については正しいかもしれませんが、私はこのライブラリを私が書いているように柔軟性を持って書いておきたいと思います。彼が適切な方法でsshのことをやるつもりなら、それはエンドユーザに任されます。 – Zbigh1

2

すでに実行しているプログラム、たとえばlftpを探します。

それとも、何をすべきかのアイデアを得るために、このPerlのワンライナーをstraceの:

perl -MNet::OpenSSH -e 'Net::OpenSSH->new(localhost, password => foo)' 

それは主に、マスター・プロセスに仮想ttyのペアを割り当てフォークとのスレーブ設定部に減少しsshをexecする前の現行のttyとしての子のpty。

関連する問題