Fórum Root.cz
Hlavní témata => Server => Téma založeno: Ħαℓ₸℮ℵ ␏⫢ ⦚ 25. 02. 2025, 12:17:32
-
Rád bych si automatizoval takovou věc, jak na klasickém linuxuvém serveru s bashem a sshd. Normálně mám ve svém profilu nastaveno uložení historie
(append, ignoreboth, ignore dups, žádné post/pre skripty) - ale způsob a režim ukládání stejně nechci řešit v dotazu.
Chtěl při vzdálené práci přes ssh ( příkaz ssh bez commandu= implicitní shell) nastavit, aby při výpadku spojení se neuložila historie. Jde to nějak ? Co vím, například syslog u sshd to dokáže rozeznat, že po timeoutu ukončí a odhlásí a do syslogu bude u PAM/sshd něco jako connection interrupted, disconnected due to inactivity. Takže to pozná
Asi, se nabízí řešení, nechat si ukládání historie vypnuté a před ukončení zařídit uložení historie... Ale co když zapomenu.. a taky je to otrava. Nejde to nějak automatizovat? V spolupráci s detekcí sshd. (Na okraj, jsou 2 způsoby jak povolit/zabránit zápisu historie :1. výmaz proměnné $HISTFILE /2 shopt -u -o history)
-
nenabidnu reseni tohoto, ale na serveru mam tmux, takze o session neprijdu.
-
Moc nechápu, čeho se snažíte docílit. Ale asi jak chcípne ssh, tak chcípne bash a ten v tom okamžiku zapíše historii.
Takže zabránit chcípnutí? Jde to jednak po ssh pustit tmux/screen, jak tady již radili. Nebo místo ssh použít mosh. Já mám mosh+screen.
-
asi mluvíš o tom, že historii ukládá až po řádném zavření procesu, což není zabití procesu na timeout.
Doplň si do bash_profile třeba tohle:
shopt -s histappend
PROMPT_COMMAND='history -a;history -n'
Způsobí to, že se historie uloží okamžitě po každém příkazů a po každém příkazu to znovu načte historii ze souboru, tj. vidíš tam i věci z jiných session a násilné ukončení session ti nezpůsobí ztrátu historie.
Nebo používej jinej shell zsh, fish nebo použij něco co spravuje historii za tebe, např. https://github.com/atuinsh/atuin.
-
Ne ne,tímto směrem dotaz nemíří.POkud dojde k nenedálému ukončení bashi přes ssh, tak aby se neprovedl zápis historie. je proměnná TMOUT k něčemu dobrá? A já nechci řešit samotnou metodologii / režim ukládání příkazů/multiplexing, stačí mi histappend,. Pouze řeším, aby se v těchto případech na historii nešahalo.
A bude tohle fungovat ? Nemá to háček, že už v okamžiku trap se historie zapíše?
návrh 1
export PROMPT_COMMAND='history -a; history -n; if [[ $? -ne 0 ]]; then history -c; fi'
if [[ $SSH_CONNECTION ]]; then
export HISTFILE=/dev/null
fi
export TMOUT=600
návrh 2
if [[ $SSH_CONNECTION ]]; then
trap 'history -c' EXIT INT TERM
fi
návrh 3
if [[ $SSH_CONNECTION ]]; then
trap 'history -c' EXIT
# nepřidat exit; ?
fi
návrh 4 - >:(ruční >:((v konfigu vypnout history)
shopt -s -o history před každým plánovaným ukončením
-
Tohle mi smrdí pokusem o zahlazení stop po nelegální aktivitě na vzdáleném stroji když tě někdo killne...
-
Tak standardni reseni neukladani do historie je mezera na zacatku zadavaneho prikazu. Jen na to nesmis zapomenout 8).
-
Tohle mi smrdí pokusem o zahlazení stop po nelegální aktivitě na vzdáleném stroji když tě někdo killne...
vacsina systemov je by default nakonfigurovana aby bash commandy so spaceom neukladal ($HISTCONTROL ignorespace, resp. ignoreboth). Aky by toto malo zmysel? Navyse ak by slo o zahladenie stop, otvoril by si dalsi session uplne bez historie a nasledne by ju manuale modifikoval ako len chce,
-
No v první řadě název tématu není "Při výpadku SSH se neuloží historie" (to je asi nějaký špatný AI překlad , kdy změna tvaru slovesa změní význam sdělení), jak bylo změněno, ale jak ji neukládat při této podmínce. Aby bylo zabráněno dalšímu zmatení
A já už jsem psal (řešení, které se k tomu blíží, ale není to to pravé ořechové), asi prvním a třetím postu : ono by to šlo obrátit, že bych si nechal ukládáni historie defaultně vypnuté a ručně bych si před ukončením pokaždé ukládání historie zapnul. Docílil bych výsledku, na to ,co se ptám, akorát je to takové nekomfortní.
špekulanti , konspirátoři, kdyby šlo o nelegální aktivitu, co brání spustit unset HISTFILE hned na začátku
jo mezera na začátku řádku, fakt geniální. asi jako kupovat cihly na barák po jedné a každou balit do papíru a vybalovat.
-
hlavně spuštěné přikázy by se měly monitorovat přes něco jako auditd a neplnět na tom, že to shell sám někam zapíše, že jo.
Popravdě api po vysvětlení nerozumím tomu o co se snažíš.
Pokud chceš historii zapsat až se něco úspěšně povede. Tak změň cestu pro history soubor (třeba pomoci mktemp), nech aby to bash ukládal tam a na konci si to appendni (cat $tmp >> $HISTFILE), to můžeš udělat třeba přes TRAP "cat $tmp >> $HISTFILE" EXIT a zavolá se ti to jen při řádném ukončení scriptu.