我意識到這個問題經常被問到,主要是想攔截SSH的密碼詢問階段的人。這不是我想要的。我在登錄後的文本後。如何攔截SSH stdin和stdout? (不是密碼)
我想寫一個ssh的包裝器,它充當SSH和終端之間的中介。我想這個配置:
(typing on keyboard/stdin) ----> (wrapper) ----> (ssh client)
和同樣來自SSH來輸出:
(ssh client) -----> (wrapper) -----> stdout
我似乎能夠達到標準輸出我想要的效果做一個標準的把戲我在網上找到(簡體代碼):
pipe(fd)
if (!fork()) {
close(fd[READ_SIDE]);
close(STDOUT_FILENO); // close stdout (fd #1)
dup(fd[WRITE_SIDE]); // duplicate the writing side of my pipe (to lowest # free pipe, 1)
close(STDERR_FILENO);
dup(fd[WRITE_SIDE]);
execv(argv[1], argv + 1); // run ssh
} else {
close(fd[WRITE_SIDE]);
output = fdopen(fd[READ_SIDE], "r");
while ((c = fgetc(output)) != EOF) {
printf("%c", c);
fflush(stdout);
}
}
就像我說的,我認爲這是有效的。但是,我似乎無法做相反的事情。我無法關閉(STDIN_FILENO)並重復管道的讀取。看來,SSH檢測到這一點,並阻止它。我讀過我可以使用「-t -t」選項來強制SSH忽略其輸入的非標準輸入性質;但是當我嘗試這個時,它仍然不起作用。
任何提示?
非常感謝!
你真的應該使用'dup2'而不是'dup'來代替stdout/stdin等。 – Hasturkun 2011-04-11 14:25:03
如果你使用私鑰而不是密碼,'ssh'不應該關心stdin的文件類型。你可以試試嗎? – 2011-04-11 15:44:04