
В качестве последней команды моего decrypt.sh
скрипта я хочу, чтобы он создал новую оболочку в только что созданной папке с unset HISTFILE
.
На этом этапе пользователь должен иметь возможность взаимодействовать с этой новой оболочкой.
В этой папке будет encrypt.sh
скрипт, который пользователь может запустить. В качестве последнего действия он должен удалить папку и выйти из этой оболочки, вернув пользователя в исходную оболочку.
Как мне этого добиться?
Хотя решение на bash было бы полезным для меня, универсальное решение может оказаться полезным для кого-то другого (но, может быть, оно невозможно?).
решение1
Сценарий decrypt.sh
:
#!/bin/bash
# Create working directory.
tmpdir=$(mktemp -d)
# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT
# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"
# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )
Сценарий encrypt.sh
:
#!/bin/bash
# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT
# rest of script goes here
Скрипт decrypt.sh
заботится о настройке рабочего каталога и его удалении. Настройка каталога включает его создание (используя mktemp -d
для создания временного каталога) и копирование encrypt.sh
в него скрипта из любого места, где может находиться оригинал. Удаление рабочего каталога происходит при decrypt.sh
завершении скрипта.
Скрипт encrypt.sh
завершит свою родительскую оболочку, когда сам выйдет, отправив ей сигнал HUP
, побуждающий decrypt.sh
скрипт удалить рабочий каталог. Каталог также будет удален, если пользователь выйдет из интерактивной оболочки, не запустив encrypt.sh
.
Вместо того, чтобы пытаться или HISTFILE
устанавливать/dev/null
не установленв созданной интерактивной оболочке вы можете просто установить HOME
временный каталог. Файл истории будет создан в $HOME
и будет удален вместе с каталогом при decrypt.sh
выходе:
( cd "$tmpdir" && HOME="$tmpdir" bash )
Обратите внимание, что это влияет на поведение раскрытия тильды и cd
без аргумента, а также на все остальное, что может использовать эту HOME
переменную.
Менее инвазивный вариант — явно задать HISTFILE
переменной имя файла во временном каталоге:
( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )
Немного похоже: Инструмент, который использует некоторые из этих вещей (создает интерактивную оболочку во временном рабочем каталоге в чистой среде, с очисткой при выходе из оболочки):
Отказ от ответственности: это написал я.