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:
Citace
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).
Citace od: Bugsa kdy 25. 02. 2025, 13:13:32
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.