Dừng đăng nhập ssh từ in motd từ khách hàng?


44

Tôi đã thiết lập mật khẩu SSH, tuy nhiên, nó sẽ in MoTD khi đăng nhập. Có cách nào để ngăn chặn điều đó xảy ra từ phía khách hàng không?

Tôi đã thử ssh -qnhưng không được. Tôi không muốn sử dụng ~/.hushloginvà tôi cũng không muốn thay đổi máy chủ được thiết lập. Điều duy nhất có thể làm việc là làm im lặng tất cả đầu ra, với >/dev/null 2>&1. Tuy nhiên, tôi không muốn bỏ qua lỗi trong trường hợp thực sự có vấn đề. Ngay cả khi >/dev/nullkhông làm việc, vì sshdường như in motd đến stderr.

Cập nhật & lý luận Tôi đang chạy sao lưu trong một cron. Tôi không muốn nhận email cron trừ khi xảy ra lỗi. Tuy nhiên, nếu motd được in, tôi sẽ nhận được email mọi lúc.

Tôi muốn giữ motd được in vì điều đó có ý nghĩa pháp lý. Các motd nói "cấm truy cập không được giám sát". Bạn cần phải có loại tuyên bố này trong đó để ngăn chặn một cách hợp pháp mọi người truy cập nó (giống như một dấu hiệu không xâm phạm). Do đó tôi không muốn tắt chăn mọi lúc.


1
Bạn có thể thêm một số chi tiết về công việc định kỳ ...
Kyle Brandt

1
Các motd chỉ được in cho các phiên tương tác. Tôi mới thử nó và nó là như vậy:> $ ssh host → MOTD đã in> $ ssh host ls → chỉ in nội dung của thư mục chính Nói cách khác, bạn đang làm gì đó rất sai; bạn đã thử chưa
niXar

Cũng đáng lưu ý để kiểm tra /etc/profile.dbất kỳ tập lệnh nào có thể chạy ở đó và in một số đầu ra ra bàn điều khiển khi đăng nhập.
Dave

4
Có thực sự có luật yêu cầu bạn nói "cấm truy cập trái phép" không? Tôi nghĩ DMCA làm cho việc phá vỡ bất kỳ loại hệ thống điện tử nào ( bất kể được bảo vệ kém đến mức nào ), miễn là bạn có một số yêu cầu về mật khẩu / khóa SSH, điều này có vẻ giống như thay đổi cửa sổ thuần túy.
Nick T

Câu trả lời:


58

Tôi không chắc tại sao bạn lại có ác cảm với việc này một cách chính xác - trên máy chủ

PrintMotd no
PrintLastLog no

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

Hoặc thêm ~ / .hushlogin cho mỗi người dùng.

Gợi ý, cho ~ / .hushlogin, thêm nó vào / etc / skel để thư mục nhà người dùng mới được tạo với tệp.

Cập nhật:

Không có thêm thông tin về công việc cron sao lưu của bạn, đề nghị khác của tôi là chuyển hướng đầu ra của lệnh sang một tệp (hoặc để cron chụp nó trong email) và đầu ra của phiên ssh thành / dev / null. Cái gì đó như:

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null

Hoặc là

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null

Tôi sẽ phải chơi xung quanh với các lệnh một chút, nhưng điều đó sẽ giúp bạn bắt đầu.


3
Tôi thích "làm đúng".
Benoit

14
Tôi không muốn xóa nó khỏi máy chủ vì tôi cần giữ thông báo 'quyền truy cập bị cấm' ở đó vì lý do pháp lý.
Rory

3
Fwiw, thông báo không ngăn chặn truy cập trái phép, nó chỉ thông báo cho mọi người rằng bạn có thể (và sẽ) có hành động pháp lý phù hợp và có thể giám sát việc sử dụng của họ, giống như thông báo về việc ghi âm cuộc trò chuyện qua điện thoại.
jtimberman

Ngoài ra, nó sẽ giúp ích rất nhiều nếu bạn dán công việc định kỳ mà bạn đang sử dụng.
jtimberman

3
.hushloginlà tốt đẹp
andrewtweber

16

Nếu bạn muốn điều này trên cơ sở cho mỗi người dùng, chỉ cần thực hiện touch ~/.hushloginvà bạn đã hoàn tất cài đặt với OpenSSH.

Cập nhật : Như đã chỉ ra ở nơi khác, pam_motdcó thể được định cấu hình để không sử dụng cho mỗi người dùng .hushlogin; kiểm tra /etc/login.defscho HUSHLOGIN_FILE. Nó có thể được cấu hình để có tất cả người dùng được liệt kê trong /etc/hushloginshoặc tương tự.


2
Tôi đã thử nó, nhưng nó không hoạt động. Như những người khác đã chỉ ra, motd có thể được in từ pam
Rory

11

@note Tất cả các ví dụ giả sử bạn đã đặt một biến connectionStringvới một cái gì đó như connectionString=user@server.

Làm thế nào tôi có được giải pháp

Sử dụng ssh -Tnên làm việc cho các lệnh đơn giản. Ví dụ: điều này không in thêm bất kỳ thông tin nào:

ssh -T $connectionString "echo 'blah'"

Vấn đề là khi bạn cố gắng sử dụng here-doc để chạy nhiều lệnh. Ví dụ: dưới đây sẽ KHÔNG hoạt động - nó sẽ lặp lại tin nhắn trong ngày (MoTD) và cũng có thể hiển thị cho bạn "stdin: không phải là một tty".

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

Để khắc phục sự cố, trước tiên bạn cần lưu các lệnh vào biến cục bộ và gửi chúng đến máy chủ từ xa.

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"

Nhưng đó là mớ hỗn độn ...

Giải pháp cuối cùng

Tạo một hàm phổ quát (lưu ý rằng nó có thể lấy một chuỗi hoặc HEREDOC làm lệnh).

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}

Ví dụ

Sử dụng như thế này:

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

Hoặc như vậy:

silentSsh $connectionString "echo 'blah'"

Hoặc như vậy:

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC

Hoặc thậm chí như vậy:

silentSsh $connectionString < getlines.sh

Tôi ước tôi có nhiều upvote cho điều này. Rất hữu ích trong việc tìm ra một số kịch bản quá mức mà chúng ta cần phải làm.
csexton

Câu trả lời tuyệt vời !! Cảm ơn rât nhiều!!
Scottie H

10

Làm thế nào về hack này? ;-P

ssh -t user@machineName '/bin/bash'

Những điều sau đây không hợp lệ:

Chuyển -Tđến ssh để tắt phân bổ tty:

ssh -T machineName 'echo foo'

3
ssh user @ machine 'lệnh của bạn ở đây' dù sao cũng không hiển thị motd (nó không phải là trình bao tương tác).
Marie Fischer

Oh tốt, điểm ....
Kyle Brandt

nhưng điều đó có nghĩa là "nó không phải là một vỏ tương tác" vì tôi đã thử và tôi có thể chạy các lệnh mà tôi sẽ thiếu bằng cách sử dụng-t
Ciasto piekarz

xin lưu ý rằng việc thêm "-t" sẽ thay đổi hành vi (nó hiển thị theo cài đặt TATE của bạn, thêm các ký tự điều khiển khi cần, v.v.). Nó có thể thay đổi kết quả của một số lệnh (ví dụ: có thể gây ra lỗi giới thiệu trong: ssh -t somehost "tar cf - some files"> local.tar # KHÔNG sử dụng -t ở đây ... đặc biệt nếu bạn ssh một máy chủ unix từ một cửa sổ một. Nhưng nhiều vấn đề khác có thể phát sinh trong các trường hợp khác). Xem câu trả lời tuyệt vời của @StephaneChazelas: unix.stackexchange.com/questions/151916/ gợi
Olivier Dulac

3

Hệ điều hành này là gì? Trên một số hệ thống (như ubfox), motd không được in bởi máy chủ ssh (PrintMotd in / etc / ssh / sshd_config), nhưng bằng pam với pam_motd. Nếu đây là trường hợp thì có lẽ bạn không thể kiểm soát nó từ máy khách.


bạn không thể kiểm soát nó trong ứng dụng khách ssh, nhưng bạn có thể chắc chắn về phía khách hàng :) .. xem câu trả lời của tôi để biết chi tiết
drAlberT

Không, bạn đã đề xuất một cách hack khá thú vị / thông minh xung quanh motd được in, không phải là giải pháp để ngăn chặn nó được in bởi khách hàng, đó là câu hỏi.
theotherreceive

2

Bạn phải làm điều đó trên máy chủ:

PrintMotd no
PrintLastLog no

Trên debian / ubtfox cũng băm dòng với pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

Không, bạn không có. Xem câu trả lời của Kyle Brandt bên dưới.
Stobor

-1 - Trả lời không phản ánh câu hỏi đã chỉnh sửa. Không còn liên quan.
romandas

2

Đừng thực thi lệnh ssh trực tiếp bằng cron.

Thay vào đó, hãy tạo một tập lệnh bash helper , thực thi công việc ssh và tìm nạp đầu ra, các lỗi và mã lỗi nếu cần; cuối cùng phân tích chúng để loại bỏ các chuỗi không mong muốn khỏi các thông báo lỗi (MoTD trong trường hợp của bạn) và sau đó in lại trên đầu ra tập lệnh bash và các luồng lỗi bạn đã thu được theo cách đó.

Hơn đặt kịch bản bash này trong cron và sống hạnh phúc :)

Lưu ý: Đây là một giải pháp chung và phải thực hiện bất kỳ công việc nào bạn phải thực hiện thông qua ssh. Đó cũng chỉ là phía máy khách, đáp ứng nhu cầu của bạn ... sự phụ thuộc duy nhất của máy khách vào cấu hình máy chủ là kiến ​​thức về thông điệp chính xác mà bạn muốn cắt ra từ lỗi std hoặc từ ssh client


2
Đó không phải là một giải pháp đó là một cách giải quyết.
niXar

Tôi không thể đồng ý với bạn xin lỗi. IMHO đó là cách mọi thứ nên được thực hiện sạch sẽ ... Tôi đã đồng ý với bạn nếu có một cách để cấu hình rõ ràng máy khách ssh để bỏ qua motd, nhưng nó không thể tồn tại, đơn giản vì nó không nằm trong sự kiểm soát của sshd !
drAlberT

2

Chỉ là một sidenote (sẽ là một bình luận, nếu tôi có thể đăng nó): Nội dung của motd được hiển thị sau khi đăng nhập thành công vào hệ thống. Nếu tôi muốn ngăn chặn một cách hợp pháp mọi người truy cập vào một hộp, tôi muốn làm điều đó bằng một "Biểu ngữ" trong sshd_config. Nội dung được hiển thị sau khi nhập Tên người dùng nhưng trước khi xác thực.


4
có, nhưng bạn có thể vô hiệu hóa biểu ngữ bằng cách sử dụng -q trên máy khách ssh, vì vậy tôi không thể đồng ý với ghi chú của bạn
drAlberT

1
Ôi trời, tôi hoàn toàn có thể nhìn thấy nó, "-q" đánh bại toàn bộ hàng phòng thủ của đội pháp lý crack làm việc cho Dynacorp Inc. Trời ạ! Họ đã không nhìn thấy nó đến. Thực tế. Nếu ai đó được cho là nhìn thấy biểu ngữ cố tình lảng tránh nó ... thì biểu ngữ vẫn còn ràng buộc, vì bạn phải biết để tránh nó.
niXar

2

Hoặc bạn chưa thử những gì bạn mô tả hoặc máy chủ của bạn bị cấu hình sai!

Đây là những gì tôi vừa thử trên RHEL5:

workstation ~ $ ssh root@server
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh root@server
MOTD
server ~ # ^D
workstation ~ $ ssh root@server echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

Tôi không cho rằng bạn cần từ chối trách nhiệm để được gửi đến các vỏ không tương tác, phải không? (Nếu bất cứ ai tuyên bố bạn làm, hãy giúp tôi, hãy đá họ trong các loại hạt.) Bởi vì đó chính xác là lý do tại sao có sự phân biệt giữa vỏ tương tác và vỏ không tương tác.

Nhưng trong mọi trường hợp, đây là những gì tôi làm vì tôi không thích thư từ cron: Tôi chuyển đầu ra sang logger. Chỉ cần luồn nó qua đuôi để loại bỏ vài dòng đầu tiên (giả sử 3) từ chối trách nhiệm vô nghĩa của bạn như vậy (mã chưa được kiểm tra, tôi không có quyền truy cập vào tập lệnh của mình):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job

Nếu bạn nhìn vào man sshd, bạn sẽ thấy thông báo: QUY TRÌNH ĐĂNG NHẬP Khi người dùng đăng nhập thành công, sshd thực hiện như sau: 1. Nếu đăng nhập ở trên tty và không có lệnh nào được chỉ định, hãy in thời gian đăng nhập lần cuối và / etc / motd (trừ khi bị chặn trong tệp cấu hình hoặc bởi ~ / .hushlogin; xem phần PHIM). 2. ... Lưu ý rằng nếu một lệnh được nhập vào thư mục trong thông tin đăng nhập ssh, không có MOTD nào được hiển thị
katriel

Tôi biết, đó là những gì tôi đã chứng minh. Ý bạn là sao?
niXar

1

Nếu tôi hiểu bạn, bạn cần motd vì những lý do khác nhưng không cần motd để sao lưu. Trong cấu hình của sshd không thể chỉ thiết lập nó trên cơ sở người dùng trên toàn cầu. Vì vậy, bạn cần giải quyết sự ức chế motd ở phía khách hàng. Nhưng không có sự khác biệt giữa văn bản của motd và thông báo lỗi của phần mềm sao lưu. Cả hai đều là văn bản trong thiết bị đầu cuối. Giải pháp duy nhất tôi thấy để tạo sự khác biệt giữa hai thông điệp này, sau đó lọc tin nhắn của motd. Bởi vì thông điệp của phần mềm rất khó sửa đổi, tôi đề nghị sửa đổi văn bản của motd. Ví dụ: đặt một khung xung quanh:

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

Sau đó, bạn nên lọc văn bản giữa khung và thả nó.


1

GIẢI PHÁP TẠI ĐÂY:

Trong trường hợp bạn không phụ trách máy chủ và bạn không thể thay đổi cấu hình motd hoặc sshd, hãy sử dụng lệnh như sau:

Chuyển hướng STDERR sang STDOUT cho (các) lệnh từ xa để bạn sẽ thấy nó. Và sau đó chuyển hướng STDERR của ssh sang / dev / null. MOTD đi đến STERR và kết thúc bằng / dev / null. Bất kỳ thông báo lỗi AND tiêu chuẩn nào từ lệnh từ xa sẽ được hiển thị (khi nó đi đến STDOUT)

Biến 1 - nếu bạn quan tâm đến trạng thái thoát của lệnh được thực thi từ xa:

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

Biến 2 - nếu bạn muốn bỏ qua mã thoát của lệnh từ xa - chỉ cần thực thi đúng như lệnh từ xa cuối cùng

ssh remotehost "(remote_command; true) 2>&1" 2>/dev/null || echo SSH connection failed

Ví dụ về thông báo lỗi:

Ví dụ 1:

ssh remotehost " fail_ remote_command 2> & 1" 2> / dev / null || echo kết nối SSH không thành công hoặc lệnh từ xa trả về mã thoát không bằng 0
 bash: fail_remote_command: không tìm thấy lệnh
Kết nối SSH hoặc lệnh từ xa không thành công - một trong số chúng đã trả về mã thoát không bằng không 127

Ví dụ 2:

ssh remotehost " fail_ remote_command 2> & 1; true " 2> / dev / null || echo kết nối SSH không thành công
 bash: fail_remote_command: không tìm thấy lệnh

Ví dụ 3a:

ssh remotehost " fail_ remote_command 2> & 1; true" 2> / dev / null || echo kết nối SSH không thành công
 # không có tin nhắn nào được hiển thị

Ví dụ 3b:

ssh nonexistinghost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo kết nối
 SSH không thành công Kết nối SSH không thành công

0

Bạn đã thử loại bỏ văn bản trong tập tin motd? Chỉ là một ý nghĩ.

Hint: /etc/motd

4
Ông nói từ phía khách hàng, từ phía máy chủ cài đặt PrintMotd thành không trong sshd_config có lẽ sẽ tốt hơn
Kyle Brandt

0

Bạn đang cố gắng làm gì và tại sao MoTD làm phiền bạn? Tôi đoán đang thực hiện một lệnh từ xa và phân tích cú pháp đầu ra? Nếu vậy, điều này có thể được thực hiện bằng nhiều cách khác nhau mà không cần gọi trình bao tương tác (khiến cho motd được hiển thị).


Ồ, chẳng hạn như? Tôi thực sự muốn sử dụng ssh nghĩ ..
Rory

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.