2009-06-16 39 views
5

Tôi muốn tạo tập lệnh tự động đăng nhập vào máy chủ từ xa và lấy tệp trên máy chủ. Kịch bản đã đăng nhập vào máy chủ tuy nhiên các lệnh không được chạy trên máy đó. Khi tôi ngắt kết nối từ máy chủ từ xa, các lệnh được chạy trên máy khách.Tập lệnh UNIX ssh, chạy lệnh trên máy chủ từ xa

!/bin/sh 
ssh -o PreferredAuthentications=publickey [email protected] 
cd ~/folder 
"i would like to grab file and copy it to client machines folder" 

EDIT: Tôi không sử dụng kết nối không mật khẩu với máy chủ từ xa bằng ssh và keygeneration. Tôi đánh giá cao những ý tưởng nhưng tôi đang tìm kiếm để có thể đường ống lệnh hoặc chạy lệnh trên máy chủ từ xa với các kịch bản trên máy khách. Tôi nhận ra rằng các máy chủ từ xa không có quyền truy cập vào kịch bản khách hàng, tuy nhiên tôi đã tò mò nếu nó đã có thể ống các lệnh thông qua kết nối ssh.

+0

Nếu bạn nhấn mạnh vào việc thực thi lệnh trên ssh, bạn sẽ phải thêm tiền tố mỗi lệnh bằng cụm từ 'ssh user @ server exec'. Tuy nhiên, những gì tôi muốn biết là - bạn có sử dụng ví dụ "lấy tệp" ở trên làm tham chiếu không? và, bạn có một chuỗi lệnh phức tạp hơn để thực hiện theo cách này? – nik

+0

ủy quyền khóa công khai có thể được thiết lập bằng cách sử dụng ssh-keygen trên máy khách của bạn và tệp authorized_keys trên máy chủ (tôi đã đưa ra một liên kết tham chiếu trong câu trả lời của tôi bên dưới). – nik

Trả lời

14

Bạn nên sử dụng scp ("bản sao bảo mật") thay vì ssh ("vỏ bảo mật").

+0

Tôi đang sử dụng ssh để kết nối từ xa trong khi không nhập mật khẩu, nếu tôi sử dụng scp, nó sẽ yêu cầu mật khẩu ... có cách nào để sử dụng lệnh scp với ủy quyền chính không? – user123661

+3

scp sử dụng ssh đằng sau hậu trường. Bạn có thể sử dụng tùy chọn -o để chuyển bất kỳ tham số nào bạn muốn ssh (như PreferredAuthentication) – itsadok

2

ssh trong tập lệnh không hoạt động như vậy. Tuy nhiên nó không có khả năng để thực hiện một lệnh trên một máy chủ từ xa bằng cách xác định lệnh như một cuộc tranh cãi để ssh, như:

ssh [email protected] do_foo.sh

sẽ chạy script do_foo.sh trên máy chủ

Tuy nhiên đối với trường hợp của bạn, có vẻ như những gì bạn đang thực sự tìm kiếm là SCP.

3

Bạn nên sử dụng ssh theo cách này để thực hiện kịch bản trên máy từ xa,

ssh [email protected] exec /path/to/script/script.sh 

nơi script.sh có sẵn trên máy chủ trên con đường đưa từ user đăng nhập.


Nếu kịch bản không có mặt trên máy chủ nhưng có sẵn trên máy tính cục bộ của bạn (và bạn không có chung NFS chia sẻ không gian giữa hai máy), bạn nên gửi kịch bản với scp như thế này,

scp script.sh [email protected]:/path/to/script/ 

Bây giờ, đối với trường hợp cụ thể của bạn nhận được một tập tin máy chủ bạn chỉ nên thực hiện,

scp [email protected]:/path/to/file/filename . 

giống như một số câu trả lời khác đã đề xuất.

+0

Tôi đã tự hỏi liệu bạn có thể xem bản chỉnh sửa của mình không và cho tôi biết bạn nghĩ gì hoặc có thể sử dụng ủy quyền khóa với SCP. – user123661

+0

ủy quyền khóa công khai có thể được thực hiện với hai bước. (1) sử dụng ssh-keygen để tạo cặp khóa và sau đó, (2) sao chép dòng khóa công khai vào tệp 'authorized_keys' trên máy chủ; có trong thư mục '~/.ssh /'. – nik

+0

@brjones, tham chiếu này sẽ giúp, http://www.ssh.com/support/documentation/online/ssh/adminguide/32/Public-Key_Authentication-2.html – nik

0

Một số người đã giải thích cách làm ví dụ cụ thể mà bạn cung cấp tốt hơn và dễ dàng hơn.

Nếu bạn thực sự làm cần để viết tương tác từ xa, bạn có thể xem xét sử dụng expect.

13

Ngoài ra, nếu bạn không muốn có một kịch bản có sẵn trên máy chủ từ xa, hãy thử như sau:

ssh thehost 'cd /tmp; ls; echo Hello world, I am `hostname`' 

và cho SCP-less sao chép:

ssh localhost 'cat /bin/bash' > local_bash 
+0

lý do tại sao nó phải là ''', không phải là ' "' trong 'ssh thehost 'cd/tmp; ls; echo Xin chào thế giới, tôi là' hostname''' –

5

Nếu mục tiêu của bạn chỉ để chuyển các tập tin, bạn nên sử dụng scp. Nhưng để thực thi một số lệnh trên máy chủ từ xa mà không cần tập lệnh cụ thể trên máy chủ từ xa đó, bạn có thể chỉ cần sử dụng stdin như sau:

!/bin/sh 
ssh -o PreferredAuthentications=publickey [email protected] << EOT 
cd ~/folder 
echo "hello" > hello.txt 
... 
EOT 
1

scp? Remote là một thiết bị có hệ thống tập tin chỉ đọc. Tôi không muốn để lại các kịch bản phía sau, hoặc sử dụng nhiều invocations của ssh để làm sạch nó lên sau hoặc nhiều invocations để thực hiện nó một dòng tại một thời điểm. danh sách đi về ...

great solution here by Yarek T:

Bạn có thể phải chơi xung quanh một chút với trích dẫn hoặc thoát nhưng nó được công việc làm, với một kết nối duy nhất để điều khiển từ xa và kịch bản còn lại địa phương.

2

Ngoài các câu trả lời bằng Tiemen, tất nhiên bạn có thể đường ống lệnh từ kịch bản địa phương của bạn với:

ssh thehost < commands.sh 
0

Nếu bạn muốn gọi một kịch bản trên máy chủ từ xa, trong đó trình bày trên localhost

ssh remote [email protected] < localScript.sh

Nếu bạn muốn gọi một kịch bản mà là đã có trên máy chủ từ xa

ssh remote [email protected] "$PATH_OF_SCRIPT/remoteScript.sh"

Các vấn đề liên quan