web-dev-qa-db-ja.com

psftpプロンプトに値を渡す方法

プログラムでスクリプトファイルを作成し、次のようにpsftp.exeを呼び出します。

psftp [email protected] -pw password -b psftpscript.txt

しかし、それはユーザー入力を求めます

サーバーのホストキーはレジストリにキャッシュされません。サーバーがあなたが思っているコンピューターであるという保証はありません。サーバーのrsa2キーフィンガープリントは次のとおりです。[ssh-rsa 1024 somekey]このホストを信頼できる場合は、「y」を入力して、キーをPuTTYのキャッシュに追加し、接続を続行します。キーをキャッシュに追加せずに1回だけ接続を続行する場合は、「n」を入力します。このホストを信頼しない場合は、Returnキーを押して接続を破棄します。キーをキャッシュに保存しますか? (はい/いいえ)

完全にプロンプ​​トなしで自動である必要があります。私は-batchパラメータを試しましたが、接続を放棄するだけです

16
GaneshT

Windows Server 2008の「サンドボックス」のような環境で無人スクリプトを実行すると、同じ問題が発生しました。プロンプトでyを入力する次のコードを実行しました。

echo y | psftp [email protected] -l username -pw password -b psftpscript.txt

お役に立てれば!

注:エコーyを1回実行するだけで、2回目の実行でエコーを削除しても、キーをキャッシュするように要求されなくなりました。

23
vmitchell85

初めて実行すると、サーバーのキーが表示されます。キーをコピーして、コマンドラインで次のようにホストキーを指定します。

psftp yourhostAddress -hostkey 06:15:d4:3b:e4:e8:23:c0:d6:6d:45:47:7e:bd:8d:74 -l yourusername -pw yourpassword -batch

13

Yとキャリッジリターンだけを含む入力としてファイルを作成し、実行できます。

psftp [email protected] -pw password -b psftpscript.txt < filename.txt

http://www.sqlservercentral.com/Forums/Topic281954-9-1.aspx からのJamesに感謝します。

3
bergermeister

.Netでは、上記の方法が期待どおりに機能しないことがわかりました。トリックは、<演算子ではなく、.Netの組み込み入力リダイレクトを使用することでした。コードは次のようになります。

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "c:\\psftp.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardInput = true;            
proc.StartInfo.Arguments = strIP + " -v -l " + strUsername + " -pw " + strPassword + " -b " + strBatchFilename;            
proc.Start();
StreamWriter myStreamWriter = proc.StandardInput;
myStreamWriter.WriteLine("Y\n"); //override the public key question <---
myStreamWriter.Close();
proc.WaitForExit();
proc.Close();
2
FuzzyAmi

リモートサーバーを介して\名前を変更するファイルを削除する権限がなく、ファイルにタイムスタンプが含まれているという問題がありました。そのため、名前でファイルをダウンロードする必要がありました。 psftpはparams(または私が知っていた方法)を受け入れることができず、現在の日付に従ってファイル名を動的に変更することができませんでした。

したがって、psftpコマンドを呼び出しているバッチファイルから、コマンドを動的に作成し、関連するタイムスタンプを含むファイルを作成しました。今日のファイルだけをコピーすることができ、毎回すべてをコピーするよりも優れています。

cd "C:\CX\FTP\IG\Files"  
echo cd outbound > C:\SFTP\temp.txt
echo mget file_%date:~10,4%%date:~4,2%%date:~7,2%*.csv >> C:\SFTP\temp.txt
echo quit >> C:\SFTP\temp.txt
echo close >> C:\SFTP\temp.txt
C:\SFTP\psftp [email protected] -b C:\SFTP\temp.txt
close
exit

"echo cd outbound> C:\ SFTP\temp.txt"は古いファイルをクリーンアップし、新しいファイルのコンテンツの書き込みを開始しました。 "echo mget file_%date:〜10,4 %% date:〜4,2 %% date:〜7,2%。csv >> C:\ SFTP\temp.txt"により、コマンド: "mget file_20151008。csv"これは、 "file_20151008 ..."で始まるすべてのファイルをダウンロードし、次の2行はアクションを終了し、行 "C:\ SFTP\psftp [email protected] .com -b C:\ SFTP\temp.txt "実行します。

結果としてtemp.txtは次のようになります。

cd outbound 
mget file_20151008*.csv 
quit 
close 
1
Gil Allen

コマンドラインに問題があると思います。

Usage: psftp [options] [[email protected]]Host

試してください:

psftp -pw password -b psftpscript.txt [email protected]
0
sorcereral

これはあなたの質問に直接答えることはしませんが、可能な回避策を提供します:

スクリプトを実行するユーザーとしてコマンドプロンプトを起動し、証明書を手動で受け入れます。その後の接続では、問題は発生しません。

あなたの必要性を考えると、述べられていることを超えて、これはうまくいくかもしれないし、そうでないかもしれません。私は同じ問題でこの質問に来て、今説明したアプローチを使用してそれを解決しました。

0
matt.bungard