it-swarm-vi.tech

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

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 -q nhưng điều đó không làm việc. Tôi không muốn sử dụng ~/.hushlogin 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ể hoạt động là tắt 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 làm >/dev/null không hoạt động, vì ssh dườ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.

45
Rory

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.

58
jtimberman

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

Cập nhật: Như được chỉ ra ở nơi khác, pam_motd có 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.defs cho HUSHLOGIN_FILE. Nó có thể được cấu hình để có tất cả người dùng được liệt kê trong /etc/hushlogins hoặc tương tự.

16
towo

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

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

Sử dụng ssh -T nê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
11
Nux

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

ssh -t [email protected] '/bin/bash'

Sau đây là không hợp lệ:

Đi qua -T đến ssh để tắt phân bổ tty:

ssh -T machineName 'echo foo'
10
Kyle Brandt

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.

3
theotherreceive

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

Tạo tập lệnh bash helper thay vào đó, 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 làm việc bất kể công việc bạn phải thực hiện qua ssh là gì. Đây 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
drAlberT

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
2
ThorstenS

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 [email protected]
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh [email protected]
MOTD
server ~ # ^D
workstation ~ $ ssh [email protected] 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 để xóa 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
2
niXar

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 "thất bại_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 khác 127

Ví dụ 2:

[.__.] Ssh remotehost "thất bại_từ xa_command 2> & 1; thật"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 "thất bại_từ xa_command 2> & 1; đúng "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 nonex hiệnhost "thất bại_từ xa_command 2> & 1; đúng "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
1
Chris

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
Saabi

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

Hint: /etc/motd
0
Joseph Kern

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 Shell tương tác (khiến motd được hiển thị).

0
Marie Fischer

Bạn đã thử sử dụng một cấu hình hệ thống con ssh? Bạn có thể tìm thấy một ví dụ tại http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm thậm chí bao gồm sao lưu các tệp.

0
David