4 Commits

3 changed files with 133 additions and 32 deletions
+1 -8
View File
@@ -11,15 +11,8 @@ description: SSHRM project conventions
- Prefer minimal, focused changes that do not alter the intent of the existing scripts, unless the script behavior is intentionally updated. - Prefer minimal, focused changes that do not alter the intent of the existing scripts, unless the script behavior is intentionally updated.
- Maintain `.continue/rules/project.md` whenever project conventions or script behavior change. - Maintain `.continue/rules/project.md` whenever project conventions or script behavior change.
- `sshrm` is implemented as a small Bash script with helper functions, while preserving host and line-number removal behavior. - `sshrm` is implemented as a small Bash script with helper functions, while preserving host and line-number removal behavior.
- `sshrm` should print a short usage line, support `-h`/`--help`, fail clearly on missing or invalid line-number input, and may support a dedicated `--no-backup` option with a `known_hosts.sshrm.bak` backup file. - `sshrm` should print a short usage line, support `-h`/`--help`, fail clearly on missing or invalid line-number input, reject extra arguments, may support a dedicated `--no-backup` option with a `known_hosts.sshrm.bak` backup file, and now asks for confirmation before removal.
# Project identity # Project identity
- Main script: `sshrm` - Main script: `sshrm`
- License: GNU GPL v3 - License: GNU GPL v3
git checkout "${TAGBRANCH}"
git merge "${CURRENTBRANCH}"
git push
git tag -a "${VERSION}" -m "${MESSAGE}"
git push --tags
git checkout "${CURRENTBRANCH}"
+98 -21
View File
@@ -1,34 +1,111 @@
# sshrm #!/bin/bash
Remove an entry from `~/.ssh/known_hosts` by host name or by line number. set -euo pipefail
## Usage readonly FILENAME="${HOME}/.ssh/known_hosts"
readonly BACKUP_FILE="${FILENAME}.sshrm.bak"
```bash check_known_hosts() {
sshrm [OPTION]... HOST|LINE if [ ! -f "${FILENAME}" ]; then
``` error "known_hosts not found."
exit 1
fi
}
## Options usage() {
echo "Usage: sshrm [-h|--help] [--no-backup] host|line_number"
}
- `-h`, `--help` Show help and exit. confirm() {
read -r -p "Proceed? [y/N] " answer
case "$answer" in
y|Y|yes|YES)
return 0
;;
*)
error "cancelled."
return 1
;;
esac
}
## Examples error() {
echo "Error: $1"
}
Remove by host: is_number() {
case "$1" in
''|*[!0-9]*) return 1 ;;
*) return 0 ;;
esac
}
```bash get_host_from_line() {
sshrm example.com awk -v line="$1" 'NR == line {print $1; exit}' "${FILENAME}"
``` }
Remove by line number: create_backup() {
cp "${FILENAME}" "${BACKUP_FILE}"
}
```bash remove_host() {
sshrm 12 ssh-keygen -R "$1"
``` }
## Notes if [ "${1-}" = "" ]; then
error "missing argument."
usage
exit 1
fi
- Line numbers must be positive integers. if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
- The script edits `~/.ssh/known_hosts`. usage
- Keep a backup if you need to recover entries. exit 0
fi
backup=true
if [ "$1" = "--no-backup" ]; then
backup=false
shift
fi
if [ "${1-}" = "" ]; then
error "missing argument."
usage
exit 1
fi
if [ "${2-}" != "" ]; then
error "too many arguments."
usage
exit 1
fi
check_known_hosts
if is_number "$1"; then
if [ "$1" -eq 0 ]; then
error "invalid line number."
exit 1
fi
HOST="$(get_host_from_line "$1")"
if [ "${HOST}" = "" ]; then
error "invalid line number."
exit 1
fi
else
HOST="$1"
fi
if ! confirm; then
exit 1
fi
if [ "${backup}" = true ]; then
create_backup
fi
if ! remove_host "$HOST"; then
error "removal failed."
exit 1
fi
+33 -2
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
set -u set -euo pipefail
readonly FILENAME="${HOME}/.ssh/known_hosts" readonly FILENAME="${HOME}/.ssh/known_hosts"
readonly BACKUP_FILE="${FILENAME}.sshrm.bak" readonly BACKUP_FILE="${FILENAME}.sshrm.bak"
@@ -39,6 +39,20 @@ remove_host() {
ssh-keygen -R "$1" ssh-keygen -R "$1"
} }
confirm() {
local prompt="$1"
read -r -p "Remove ${prompt}? [y/N] " answer
case "$answer" in
y|Y|yes|YES)
return 0
;;
*)
error "cancelled."
return 1
;;
esac
}
if [ "${1-}" = "" ]; then if [ "${1-}" = "" ]; then
error "missing argument." error "missing argument."
usage usage
@@ -62,9 +76,19 @@ if [ "${1-}" = "" ]; then
exit 1 exit 1
fi fi
if [ "${2-}" != "" ]; then
error "too many arguments."
usage
exit 1
fi
check_known_hosts check_known_hosts
if is_number "$1"; then if is_number "$1"; then
if [ "$1" -eq 0 ]; then
error "invalid line number."
exit 1
fi
HOST="$(get_host_from_line "$1")" HOST="$(get_host_from_line "$1")"
if [ "${HOST}" = "" ]; then if [ "${HOST}" = "" ]; then
error "invalid line number." error "invalid line number."
@@ -74,8 +98,15 @@ else
HOST="$1" HOST="$1"
fi fi
if ! confirm "$HOST"; then
exit 1
fi
if [ "${backup}" = true ]; then if [ "${backup}" = true ]; then
create_backup create_backup
fi fi
remove_host "$HOST" if ! remove_host "$HOST"; then
error "removal failed."
exit 1
fi