.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "SSH-LAST 1" .TH SSH-LAST 1 2024-09-26 SSH-TOOLS "User Commands" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" ssh\-last \- فهرست کردن آخرین نشست‌های SSH .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" .Vb 2 \& ssh\-last [OPTIONS] \& ssh_logs | ssh\-last [OPTIONS] .Ve .SS "گزینه‌ها (OPTIONS)" .IX Subsection "OPTIONS" .Vb 11 \& \-a نمایش تمام نشست‌ها (نمایش داده‌هایی که توسط فایل \*(Aqignored\*(Aq پنهان شده‌اند) \& \-c خروجی رنگی (برجسته‌سازی نشست‌های فعال SSH) \& \-d اشکال‌زدایی (debug) \& \-f اجبار به نمایش اثرانگشت‌ها (عدم نگاشت از فایل \*(Aqknown\*(Aq) \& \-h نمایش این پیام راهنما \& \-i اجبار به نمایش شناسه گواهی‌ها (عدم نگاشت از فایل \*(Aqknown\*(Aq، همراه با \-f استفاده نشود) \& \-l تلاش برای استفاده از فایل‌های لاگ به جای journalctl (ممکن است در برخی سیستم‌ها سریع‌تر باشد) \& \-n نمایش نام میزبان/IP به صورت متن خام (عدم نگاشت از فایل \*(Aqknown\*(Aq) \& \-w تنها نمایش نشست‌های فعال SSH \& \-? نمایش راهنمای کامل با اطلاعات دقیق‌تر \& (معمولاً برای عملکرد صحیح نیاز به نصب perl\-doc دارد) \& \& \-\-version نمایش اطلاعات نسخه .Ve .SS "مثال‌ها (EXAMPLES)" .IX Subsection "EXAMPLES" .Vb 4 \& ssh\-last \& ssh\-last \-c | more \& ssh\-last \-c | less \-R # حفظ خروجی رنگی در less \& ssh\-last \-cw \& \& # لاگ‌های دیروز \& LC_TIME=C journalctl _COMM=sshd \-g \*(AqAccepted|Disconnected\*(Aq \-\-since yesterday | ssh\-last \& \& # لاگ‌های سه روز پیش \& LC_TIME=C journalctl _COMM=sshd \-g \*(AqAccepted|Disconnected\*(Aq \-\-since \-3d \-\-until \-2d | ssh\-last \& \& # لاگ‌های یک ساعت گذشته \& LC_TIME=C journalctl _COMM=sshd \-g \*(AqAccepted|Disconnected\*(Aq \-\-since \-1h | ssh\-last \& \& # لاگ‌ها تا یک تاریخ مشخص \& LC_TIME=C journalctl _COMM=sshd \-g \*(AqAccepted|Disconnected\*(Aq \-\-until "2022\-03\-12 07:00:00" | ssh\-last \& \& # از فایل‌های لاگ (ترتیب باید از قدیمی‌ترین به جدیدترین باشد) \& zgrep \-hE \*(AqAccepted|Disconnected\*(Aq auth.log.2.gz auth.log.1 auth.log | ssh\-last \& zgrep \-hE \*(AqAccepted|Disconnected\*(Aq $(ls /var/log/auth.log* \-\-sort=time \-\-reverse) | ssh\-last \& zgrep \-hE \*(AqAccepted|Disconnected\*(Aq $(ls /var/log/messages* \-\-sort=time \-\-reverse) | ssh\-last \& zgrep \-hE \*(AqAccepted|Disconnected\*(Aq $(ls /var/log/secure* \-\-sort=time \-\-reverse) | ssh\-last .Ve .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" ابزار ssh\-last مانند دستور last عمل می‌کند، اما برای نشست‌های SSH است. .SS "پرچم‌های خروجی (Output Flags)" .IX Subsection "Output Flags" .Vb 9 \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ \& | | \& | AUTH_ID | \& | | \& | (C) sshd authorized login via (c)ertificate | \& | (K) sshd authorized login via public (k)ey | \& | (?) sshd authorized login via some other type (password, pam) | \& | | \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ .Ve .SS "الگوریتم (Algorithm)" .IX Subsection "Algorithm" .Vb 1 \& بررسی دقیق لاگ‌های sshd به ترتیب زمانی: \& \& ۱) یافتن خطوط ورود (Accepted) و خروج (Disconnected). \& ۲) ذخیره اطلاعات خطوط مانند username ،auth_type ،fingerprint و... \& ۳) استفاده از پورت شبکه استفاده‌شده برای بررسی نشست‌های فعال \& و بازسازی نشست‌های قدیمی با به خاطر سپردن پورت‌های شبکه ثبت‌شده \& ۴) استفاده عمده از /etc/os\-release برای سازگاری با سیستم‌های مختلف \& که در نام فایل‌های لاگ، الگوهای لاگ‌اندازی و غیره با هم تفاوت دارند... .Ve .SH "فایل‌ها (FILES)" .IX Header "FILES" .SS "نادیده‌گرفته‌شده‌ها (Ignored)" .IX Subsection "Ignored" .Vb 3 \& /etc/ssh\-tools/ssh\-last/ignored \& ~/.config/ssh\-tools/ssh\-last/ignored \& ./ignored \& \& این داده‌ها در خروجی پنهان خواهند شد مگر اینکه با گزینه \-a اجبار شود \& \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ \& |# Fingerprints | \& | | \& |SHA256:ElgyEn5xPe4VlK5jJkqauRdAKNRHdh2tGHfo0m9/IwW Jenkins | \& |SHA256:5xPe4JkqaElKNRHGHfxPe4RdAKdh2tlK5AKNRHn5xK5 foo # comment | \& |SHA256:nmKL5s7/fs45312nvjhFSRTREa44r2hfgJHJG54353R bar@gmx.de | \& | | \& |# Hosts | \& | | \& |127.0.0.1 localhost # local ssh logins | \& |192.168.1.50 nas # more comments | \& |webserver # alias from the \*(Aqknown\*(Aq file | \& | | \& |# Cert IDs | \& | | \& |user1@company.com | \& |user2@company.com with some info | \& |user3@company.com with some info # and a comment | \& | | \& |# Users | \& | | \& |git # gitlab | \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ .Ve .SS "شناخته‌شده‌ها (Known)" .IX Subsection "Known" .Vb 3 \& /etc/ssh\-tools/ssh\-last/known \& ~/.config/ssh\-tools/ssh\-last/known \& ./known \& \& برای این کلیدها مقدار نگاشت‌شده به جای کلید نمایش داده خواهد شد، \& مگر اینکه با گزینه‌های \-f (اثرانگشت‌ها) و \-n (میزبان‌ها) \& یا گزینه \-i (شناسه‌های گواهی) اجبار شود \& \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ \& |# Fingerprints | \& | | \& |SHA256:WwI/9m0ofHGt2hdHRNKAdRuaqkJj5KlV4ePx5nEyglE Sven Wick | \& |SHA256:xyk5ZZZWZKnmKL5mYdk8Poy5eds7/CD/JEwqykMnlQQ root@n40l # comment | \& |SHA256:G7h9i5+NDU72Ae40gCkxyvDz/8BH+KETw7sXHCYr5w0 sven.wick@gmx.de | \& | | \& |# Hosts | \& | | \& |127.0.0.1 localhost # local ssh logins | \& |192.168.1.50 nas # more comments | \& |192.168.50.100 webserver | \& | | \& |# Cert IDs | \& | | \& |user1@company.com vaporup | \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ .Ve .SH "باگ‌ها و محدودیت‌ها (BUGS AND LIMITATIONS)" .IX Header "BUGS AND LIMITATIONS" .SS "میزبان‌های واسط (JumpHosts)" .IX Subsection "JumpHosts" .Vb 3 \& استفاده از یک JumpHost با ProxyCommand یا ProxyJump، \& اغلب ممکن است منجر به قطع ارتباط ناقص بدون ثبت هیچ لاگی شود، \& بنابراین LOGOUT و DURATION قابل نمایش نخواهند بود. .Ve .SS "کاربران بدون امتیاز (Unprivileged users)" .IX Subsection "Unprivileged users" .Vb 1 \& در صورت امکان، ssh\-last را به عنوان ریشه (root) یا از طریق sudo اجرا کنید \& \& ۱) فایل‌های لاگ و ژورنال systemd معمولاً توسط یک کاربر عادی قابل خواندن نیستند \& ۲) گزینه ssh\-last \-w تنها به عنوان کاربر root به طور قابل اعتماد کار می‌کند، \& زیرا ss و netstat هنگام اجرا توسط کاربر عادی، اطلاعات فرآیند را نمایش نمی‌دهند \& ۳) دستور ssh\-last تلاش می‌کند اثرانگشت را از فایل authorized_keys کاربر نگاشت کند \& اما معمولاً کاربران اجازه دسترسی به فایل‌های یکدیگر را ندارند .Ve .SS "ارتقای سیستم‌عامل (OS Upgrades)" .IX Subsection "OS Upgrades" .Vb 5 \& اگر یک ارتقای درجا (in\-place) مانند dist\-upgrade را در Debian/Ubuntu انجام دهید، \& بسته به تفاوت نسخه، \& ممکن است رخ دهد که sshd از آن نقطه به بعد به شکلی متفاوت لاگ ثبت کند \& و ممکن است ترکیبی از لاگ‌ها با قالب جدید و قدیمی داشته باشید \& که در نتیجه ssh\-last تنها جدیدترین موارد را به درستی نمایش می‌دهد .Ve .SS "ناهمخوانی لاگ‌ها (Log inconsistency)" .IX Subsection "Log inconsistency" .Vb 5 \& مواردی مشاهده شده است که برخی از پیام‌های لاگ "Disconnect" مربوط به sshd \& در ژورنال systemd مفقود بودند اما در /var/log/auth.log وجود داشتند. \& بنابراین، اگر ssh\-last زمان خروج و مدت‌زمان را نمایش نمی‌دهد \& اما خطوط لاگ در فایل لاگ وجود دارند، بررسی کنید که آیا پیام لاگ \& واقعاً به ژورنال systemd رسیده است یا خیر، زیرا ssh\-last به طور پیش‌فرض از journald استفاده می‌کند .Ve .SH "نکات (NOTES)" .IX Header "NOTES" .SS "اسکریپت‌های کمکی (Helper Scripts)" .IX Subsection "Helper Scripts" .Vb 2 \& برای راحتی می‌توانید اسکریپت‌های واسط کوچکی مانند نمونه زیر بسازید \& که با محدود کردن داده‌ها صرفاً به هفته گذشته، از پردازش لاگ‌های بسیار زیاد جلوگیری می‌کند \& \& my\-ssh\-last \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ \& | #!/usr/bin/env bash | \& | | \& | LC_TIME=C journalctl _COMM=sshd \-\-since \-1week \e | \& | | grep \-E \*(AqAccepted|Disconnected\*(Aq \e | \& | | ssh\-last "$@" | \& | | \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ .Ve .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBssh\-keyinfo\fR\|(1), \fBssh\-certinfo\fR\|(1) .SH "نویسنده (AUTHOR)" .IX Header "AUTHOR" Sven Wick