first of openwrt-tollgate-UI enhancements
This commit is contained in:
parent
56e4c30261
commit
b13751e6d1
85
scripts/gl-inet-enable-ssh.sh
Executable file
85
scripts/gl-inet-enable-ssh.sh
Executable file
@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ./gl-inet-enable-ssh.sh <password> [router-ip]
|
||||||
|
#
|
||||||
|
# Defaults to 192.168.8.1. It does:
|
||||||
|
#
|
||||||
|
# 1. Completes OOBE/init (sets password + enables SSH)
|
||||||
|
# 2. Challenge-response login
|
||||||
|
# 3. Explicitly enables SSH via API
|
||||||
|
# 4. Verifies SSH is working
|
||||||
|
#
|
||||||
|
# Needs curl, python3, openssl, sshpass, and md5sum on the machine running it.
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROUTER="${GL_ROUTER:-192.168.8.1}"
|
||||||
|
PASSWORD="${1:?Usage: $0 <password> [router-ip]}"
|
||||||
|
HOST="${2:-$ROUTER}"
|
||||||
|
|
||||||
|
challenge() {
|
||||||
|
curl -sk "http://$HOST/rpc" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"jsonrpc\":\"2.0\",\"method\":\"challenge\",\"params\":{\"username\":\"root\"},\"id\":1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
login() {
|
||||||
|
local hash="$1"
|
||||||
|
curl -sk "http://$HOST/rpc" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"jsonrpc\":\"2.0\",\"method\":\"login\",\"params\":{\"username\":\"root\",\"hash\":\"$hash\"},\"id\":2}"
|
||||||
|
}
|
||||||
|
|
||||||
|
rpc_call() {
|
||||||
|
local sid="$1" module="$2" method="$3" params="$4"
|
||||||
|
curl -sk "http://$HOST/rpc" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"jsonrpc\":\"2.0\",\"method\":\"call\",\"params\":[\"$sid\",\"$module\",\"$method\",$params],\"id\":3}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 1: Complete OOBE / init (enables SSH)
|
||||||
|
echo "Initializing router..."
|
||||||
|
INIT=$(curl -sk "http://$HOST/rpc" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"call\",\"params\":[\"\",\"ui\",\"init\",{\"lang\":\"en\",\"username\":\"root\",\"password\":\"$PASSWORD\",\"security_rule\":0}]}")
|
||||||
|
echo "$INIT"
|
||||||
|
|
||||||
|
if echo "$INIT" | grep -q '"error"'; then
|
||||||
|
echo "Init returned error (may already be initialized), continuing..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# Step 2: Challenge-response login
|
||||||
|
echo "Logging in..."
|
||||||
|
CHALLENGE=$(challenge)
|
||||||
|
SALT=$(echo "$CHALLENGE" | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['salt'])")
|
||||||
|
NONCE=$(echo "$CHALLENGE" | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['nonce'])")
|
||||||
|
ALG=$(echo "$CHALLENGE" | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['alg'])")
|
||||||
|
|
||||||
|
CIPHER=$(openssl passwd "-$ALG" -salt "$SALT" "$PASSWORD" 2>/dev/null)
|
||||||
|
HASH=$(printf "root:%s:%s" "$CIPHER" "$NONCE" | md5sum | cut -d' ' -f1)
|
||||||
|
|
||||||
|
LOGIN=$(login "$HASH")
|
||||||
|
SID=$(echo "$LOGIN" | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['sid'])" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$SID" ]; then
|
||||||
|
echo "Login failed: $LOGIN"
|
||||||
|
echo "SSH should still be enabled from the init call. Try: ssh root@$HOST"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Logged in. SID: $SID"
|
||||||
|
|
||||||
|
# Step 3: Enable SSH explicitly
|
||||||
|
echo "Enabling SSH..."
|
||||||
|
SSH_RESULT=$(rpc_call "$SID" "system" "set_settings" '{"key":"ssh","value":{"enable":true}}')
|
||||||
|
echo "$SSH_RESULT"
|
||||||
|
|
||||||
|
# Step 4: Verify SSH
|
||||||
|
echo "Verifying SSH on $HOST:22..."
|
||||||
|
if sshpass -p "$PASSWORD" ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@$HOST "echo SSH OK" 2>/dev/null; then
|
||||||
|
echo "Done. SSH is enabled on root@$HOST"
|
||||||
|
else
|
||||||
|
echo "SSH port not responding yet. May need a moment or SSH may already be enabled."
|
||||||
|
echo "Try: ssh root@$HOST"
|
||||||
|
fi
|
||||||
Loading…
x
Reference in New Issue
Block a user