2011-11-07 13 views
8

Tôi có một lớp C++ được sử dụng để bắt đầu và giao tiếp với các quá trình bên ngoài (tương tự như Q Q Qtcess của Qt - chúng tôi không thể sử dụng Qt khi chúng tôi đang làm việc trên một hệ thống nhúng nhỏ). Nó sử dụng các cuộc gọi hệ thống đường ống và dup2 để thiết lập một liên kết giữa quá trình cha mẹ và con. Vấn đề là - nó không hoạt động với ssh, scp và các chương trình khác mong đợi một mật khẩu. Tôi đã straced ssh và có vẻ như nó mở/dev/tty và bằng cách nào đó sử dụng nó để đọc mật khẩu từ dòng lệnh. Có cách nào để nhập mật khẩu từ lớp của tôi hoặc để phát hiện rằng một appliaction hy vọng đầu vào từ một số nguồn khác hơn stdin (không phải là xách tay ở tất cả)?Làm cách nào để đặt mật khẩu vào ssh trong C++?

+10

Bạn không muốn gửi mật khẩu. Những gì bạn muốn làm là làm cho ssh đọc và sử dụng khóa riêng của bạn trong thư mục ~/.ssh –

+0

Sử dụng xác thực khoá công khai hoặc xem askpass và ssh-agent – sehe

+0

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

Trả lời

7

Thực tiễn phổ biến đối với chương trình ssh là đọc mật khẩu trực tiếp từ thiết bị đầu cuối. Bạn cần phải phân bổ một thiết bị đầu cuối giả và thực thi ssh trong thiết bị đầu cuối giả này để nắm bắt I/O này. Trang pty man (phần 7, man 7 pty) là phần giới thiệu tốt.

Tôi muốn nói lại rằng bạn thường không muốn cung cấp mật khẩu cho ssh, có nhiều tùy chọn xác thực tốt hơn. Sử dụng xác thực khóa công khai cho các quy trình cần và có thể chạy mà không có thao tác nhập của người dùng.

+0

+1 cho đề xuất khóa công khai. Bất cứ điều gì khác sẽ có khả năng đặt mật khẩu thô trong chương trình (xấu). – jedwards

+0

Có thể bạn đang nói đúng về các lỗ hổng bảo mật, nhưng tôi chỉ muốn thư viện này tôi viết là linh hoạt khi nó đi. Nó sẽ tùy thuộc vào người dùng cuối nếu anh ta làm những điều ssh theo cách thích hợp hay không. – Zbigh1

2

Tìm một số chương trình đã thực hiện, ví dụ như lftp.

Hoặc strace này Perl one-liner để có được một ý tưởng về những gì bạn nên làm:

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

Nó chủ yếu là làm giảm đến phân bổ một cặp pseudo-tty về quá trình thạc sĩ, forking và thiết lập các bộ phận nô lệ của các pty trên đứa trẻ như tty hiện tại trước khi exec'ing ssh.