typescript-virtual-container 1.3.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +0 -1
- package/README.md +674 -1504
- package/benchmark-results.txt +21 -21
- package/builds/self-standalone.js +274 -208
- package/builds/self-standalone.js.map +4 -4
- package/builds/standalone-wo-sftp.js +201 -149
- package/builds/standalone-wo-sftp.js.map +4 -4
- package/builds/standalone.js +263 -211
- package/builds/standalone.js.map +4 -4
- package/builds/web-full-api.min.js +3 -3
- package/builds/web-full-api.min.js.map +4 -4
- package/builds/web.min.js +2 -2
- package/builds/web.min.js.map +4 -4
- package/bun.lock +14 -12
- package/dist/SSHClient/index.d.ts.map +1 -1
- package/dist/SSHClient/index.js +5 -3
- package/dist/SSHMimic/executor.d.ts +1 -3
- package/dist/SSHMimic/executor.d.ts.map +1 -1
- package/dist/SSHMimic/executor.js +20 -22
- package/dist/SSHMimic/index.d.ts.map +1 -1
- package/dist/SSHMimic/index.js +5 -3
- package/dist/SSHMimic/sftp.d.ts.map +1 -1
- package/dist/SSHMimic/sftp.js +26 -21
- package/dist/VirtualShell/shell.d.ts.map +1 -1
- package/dist/VirtualShell/shell.js +25 -3
- package/dist/VirtualShell/shellParser.d.ts +1 -8
- package/dist/VirtualShell/shellParser.d.ts.map +1 -1
- package/dist/VirtualShell/shellParser.js +2 -81
- package/dist/VirtualUserManager/index.d.ts +7 -1
- package/dist/VirtualUserManager/index.d.ts.map +1 -1
- package/dist/VirtualUserManager/index.js +47 -16
- package/dist/commands/adduser.d.ts +10 -4
- package/dist/commands/adduser.d.ts.map +1 -1
- package/dist/commands/adduser.js +75 -12
- package/dist/commands/alias.d.ts +5 -0
- package/dist/commands/alias.d.ts.map +1 -1
- package/dist/commands/alias.js +5 -0
- package/dist/commands/apt.d.ts +5 -0
- package/dist/commands/apt.d.ts.map +1 -1
- package/dist/commands/apt.js +5 -0
- package/dist/commands/awk.d.ts +10 -8
- package/dist/commands/awk.d.ts.map +1 -1
- package/dist/commands/awk.js +156 -28
- package/dist/commands/cd.d.ts.map +1 -1
- package/dist/commands/cd.js +0 -3
- package/dist/commands/clear.d.ts +5 -0
- package/dist/commands/clear.d.ts.map +1 -1
- package/dist/commands/clear.js +5 -0
- package/dist/commands/command-helpers.d.ts.map +1 -1
- package/dist/commands/command-helpers.js +8 -0
- package/dist/commands/declare.d.ts +5 -0
- package/dist/commands/declare.d.ts.map +1 -1
- package/dist/commands/declare.js +5 -0
- package/dist/commands/deluser.d.ts +12 -0
- package/dist/commands/deluser.d.ts.map +1 -1
- package/dist/commands/deluser.js +72 -6
- package/dist/commands/df.d.ts +5 -0
- package/dist/commands/df.d.ts.map +1 -1
- package/dist/commands/df.js +5 -0
- package/dist/commands/du.d.ts +5 -0
- package/dist/commands/du.d.ts.map +1 -1
- package/dist/commands/du.js +5 -0
- package/dist/commands/export.d.ts +5 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +5 -0
- package/dist/commands/grep.d.ts.map +1 -1
- package/dist/commands/grep.js +22 -4
- package/dist/commands/groups.d.ts +5 -0
- package/dist/commands/groups.d.ts.map +1 -1
- package/dist/commands/groups.js +5 -0
- package/dist/commands/gzip.d.ts +5 -2
- package/dist/commands/gzip.d.ts.map +1 -1
- package/dist/commands/gzip.js +48 -28
- package/dist/commands/head.d.ts.map +1 -1
- package/dist/commands/head.js +12 -3
- package/dist/commands/htop.d.ts +5 -0
- package/dist/commands/htop.d.ts.map +1 -1
- package/dist/commands/htop.js +5 -0
- package/dist/commands/kill.d.ts +5 -0
- package/dist/commands/kill.d.ts.map +1 -1
- package/dist/commands/kill.js +5 -0
- package/dist/commands/ln.d.ts +2 -0
- package/dist/commands/ln.d.ts.map +1 -1
- package/dist/commands/ln.js +22 -0
- package/dist/commands/ls.d.ts.map +1 -1
- package/dist/commands/ls.js +15 -0
- package/dist/commands/lsb-release.d.ts +5 -0
- package/dist/commands/lsb-release.d.ts.map +1 -1
- package/dist/commands/lsb-release.js +5 -0
- package/dist/commands/mkdir.d.ts +5 -0
- package/dist/commands/mkdir.d.ts.map +1 -1
- package/dist/commands/mkdir.js +5 -0
- package/dist/commands/mv.d.ts +5 -0
- package/dist/commands/mv.d.ts.map +1 -1
- package/dist/commands/mv.js +5 -0
- package/dist/commands/nano.d.ts +5 -0
- package/dist/commands/nano.d.ts.map +1 -1
- package/dist/commands/nano.js +5 -0
- package/dist/commands/neofetch.d.ts +5 -0
- package/dist/commands/neofetch.d.ts.map +1 -1
- package/dist/commands/neofetch.js +8 -5
- package/dist/commands/passwd.d.ts +8 -0
- package/dist/commands/passwd.d.ts.map +1 -1
- package/dist/commands/passwd.js +32 -11
- package/dist/commands/ping.d.ts +5 -0
- package/dist/commands/ping.d.ts.map +1 -1
- package/dist/commands/ping.js +5 -0
- package/dist/commands/printf.d.ts +5 -0
- package/dist/commands/printf.d.ts.map +1 -1
- package/dist/commands/printf.js +43 -12
- package/dist/commands/ps.d.ts +5 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +5 -0
- package/dist/commands/read.d.ts +5 -0
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +5 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +4 -1
- package/dist/commands/rm.d.ts +5 -0
- package/dist/commands/rm.d.ts.map +1 -1
- package/dist/commands/rm.js +5 -0
- package/dist/commands/runtime.d.ts.map +1 -1
- package/dist/commands/runtime.js +1 -57
- package/dist/commands/sed.d.ts +5 -0
- package/dist/commands/sed.d.ts.map +1 -1
- package/dist/commands/sed.js +5 -0
- package/dist/commands/set.d.ts +5 -6
- package/dist/commands/set.d.ts.map +1 -1
- package/dist/commands/set.js +5 -22
- package/dist/commands/sh.d.ts +6 -0
- package/dist/commands/sh.d.ts.map +1 -1
- package/dist/commands/sh.js +6 -0
- package/dist/commands/shift.d.ts +10 -0
- package/dist/commands/shift.d.ts.map +1 -1
- package/dist/commands/shift.js +10 -0
- package/dist/commands/sleep.d.ts +5 -0
- package/dist/commands/sleep.d.ts.map +1 -1
- package/dist/commands/sleep.js +5 -0
- package/dist/commands/sort.d.ts +5 -0
- package/dist/commands/sort.d.ts.map +1 -1
- package/dist/commands/sort.js +5 -0
- package/dist/commands/source.d.ts +5 -0
- package/dist/commands/source.d.ts.map +1 -1
- package/dist/commands/source.js +5 -0
- package/dist/commands/stat.d.ts +7 -0
- package/dist/commands/stat.d.ts.map +1 -0
- package/dist/commands/stat.js +56 -0
- package/dist/commands/su.d.ts +13 -0
- package/dist/commands/su.d.ts.map +1 -1
- package/dist/commands/su.js +45 -14
- package/dist/commands/sudo.d.ts.map +1 -1
- package/dist/commands/sudo.js +5 -0
- package/dist/commands/tail.d.ts +5 -0
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +15 -3
- package/dist/commands/tar.d.ts +5 -0
- package/dist/commands/tar.d.ts.map +1 -1
- package/dist/commands/tar.js +40 -10
- package/dist/commands/tee.d.ts +5 -0
- package/dist/commands/tee.d.ts.map +1 -1
- package/dist/commands/tee.js +5 -0
- package/dist/commands/touch.d.ts +5 -0
- package/dist/commands/touch.d.ts.map +1 -1
- package/dist/commands/touch.js +5 -0
- package/dist/commands/tr.d.ts.map +1 -1
- package/dist/commands/tr.js +45 -10
- package/dist/commands/tree.d.ts +5 -0
- package/dist/commands/tree.d.ts.map +1 -1
- package/dist/commands/tree.js +5 -0
- package/dist/commands/true.d.ts +10 -0
- package/dist/commands/true.d.ts.map +1 -1
- package/dist/commands/true.js +10 -0
- package/dist/commands/type.d.ts +5 -0
- package/dist/commands/type.d.ts.map +1 -1
- package/dist/commands/type.js +5 -0
- package/dist/commands/uname.d.ts +5 -0
- package/dist/commands/uname.d.ts.map +1 -1
- package/dist/commands/uname.js +5 -0
- package/dist/commands/uniq.d.ts +5 -0
- package/dist/commands/uniq.d.ts.map +1 -1
- package/dist/commands/uniq.js +5 -0
- package/dist/commands/unset.d.ts +5 -0
- package/dist/commands/unset.d.ts.map +1 -1
- package/dist/commands/unset.js +5 -0
- package/dist/commands/uptime.d.ts +5 -0
- package/dist/commands/uptime.d.ts.map +1 -1
- package/dist/commands/uptime.js +5 -0
- package/dist/commands/wc.d.ts +5 -0
- package/dist/commands/wc.d.ts.map +1 -1
- package/dist/commands/wc.js +5 -0
- package/dist/commands/wget.d.ts +5 -0
- package/dist/commands/wget.d.ts.map +1 -1
- package/dist/commands/wget.js +5 -0
- package/dist/commands/who.d.ts +5 -0
- package/dist/commands/who.d.ts.map +1 -1
- package/dist/commands/who.js +5 -0
- package/dist/commands/whoami.d.ts +5 -0
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +5 -0
- package/dist/commands/xargs.d.ts +5 -0
- package/dist/commands/xargs.d.ts.map +1 -1
- package/dist/commands/xargs.js +5 -0
- package/dist/self-standalone.js +254 -30
- package/dist/types/commands.d.ts +36 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/utils/tokenize.d.ts +20 -0
- package/dist/utils/tokenize.d.ts.map +1 -0
- package/dist/utils/tokenize.js +74 -0
- package/examples/web.min.js +2 -2
- package/package.json +1 -1
- package/src/SSHClient/index.ts +6 -3
- package/src/SSHMimic/executor.ts +21 -44
- package/src/SSHMimic/index.ts +7 -5
- package/src/SSHMimic/sftp.ts +28 -21
- package/src/VirtualShell/shell.ts +34 -4
- package/src/VirtualShell/shellParser.ts +2 -103
- package/src/VirtualUserManager/index.ts +43 -19
- package/src/commands/adduser.ts +86 -13
- package/src/commands/alias.ts +5 -0
- package/src/commands/apt.ts +5 -0
- package/src/commands/awk.ts +154 -29
- package/src/commands/cd.ts +0 -4
- package/src/commands/clear.ts +5 -0
- package/src/commands/command-helpers.ts +9 -0
- package/src/commands/declare.ts +5 -0
- package/src/commands/deluser.ts +84 -7
- package/src/commands/df.ts +5 -0
- package/src/commands/du.ts +5 -0
- package/src/commands/export.ts +5 -0
- package/src/commands/grep.ts +21 -8
- package/src/commands/groups.ts +5 -0
- package/src/commands/gzip.ts +54 -28
- package/src/commands/head.ts +14 -4
- package/src/commands/htop.ts +5 -0
- package/src/commands/kill.ts +5 -0
- package/src/commands/ln.ts +22 -0
- package/src/commands/ls.ts +17 -0
- package/src/commands/lsb-release.ts +5 -0
- package/src/commands/mkdir.ts +5 -0
- package/src/commands/mv.ts +5 -0
- package/src/commands/nano.ts +5 -0
- package/src/commands/neofetch.ts +8 -6
- package/src/commands/passwd.ts +35 -12
- package/src/commands/ping.ts +5 -0
- package/src/commands/printf.ts +30 -13
- package/src/commands/ps.ts +5 -0
- package/src/commands/read.ts +5 -0
- package/src/commands/registry.ts +4 -1
- package/src/commands/rm.ts +5 -0
- package/src/commands/runtime.ts +1 -61
- package/src/commands/sed.ts +5 -0
- package/src/commands/set.ts +5 -24
- package/src/commands/sh.ts +9 -3
- package/src/commands/shift.ts +10 -0
- package/src/commands/sleep.ts +5 -0
- package/src/commands/sort.ts +5 -0
- package/src/commands/source.ts +5 -0
- package/src/commands/stat.ts +61 -0
- package/src/commands/su.ts +54 -16
- package/src/commands/sudo.ts +5 -0
- package/src/commands/tail.ts +17 -3
- package/src/commands/tar.ts +38 -15
- package/src/commands/tee.ts +5 -0
- package/src/commands/touch.ts +5 -0
- package/src/commands/tr.ts +54 -10
- package/src/commands/tree.ts +5 -0
- package/src/commands/true.ts +10 -0
- package/src/commands/type.ts +5 -0
- package/src/commands/uname.ts +5 -0
- package/src/commands/uniq.ts +5 -0
- package/src/commands/unset.ts +5 -0
- package/src/commands/uptime.ts +5 -0
- package/src/commands/wc.ts +5 -0
- package/src/commands/wget.ts +5 -0
- package/src/commands/who.ts +5 -0
- package/src/commands/whoami.ts +5 -0
- package/src/commands/xargs.ts +5 -0
- package/src/self-standalone.ts +316 -33
- package/src/types/commands.ts +37 -0
- package/src/utils/tokenize.ts +78 -0
- package/builds/web-iife.min.js +0 -13
- package/builds/web-iife.min.js.map +0 -7
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { ShellModule } from "../types/commands";
|
|
2
|
+
/**
|
|
3
|
+
* Set or display shell environment variables for child processes.
|
|
4
|
+
* @category shell
|
|
5
|
+
* @params ["[VAR=value]"]
|
|
6
|
+
*/
|
|
2
7
|
export declare const exportCommand: ShellModule;
|
|
3
8
|
//# sourceMappingURL=export.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,aAAa,EAAE,WAwB3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WAwB3B,CAAC"}
|
package/dist/commands/export.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/commands/grep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/commands/grep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WA0GzB,CAAC"}
|
package/dist/commands/grep.js
CHANGED
|
@@ -12,12 +12,15 @@ export const grepCommand = {
|
|
|
12
12
|
params: ["[-i] [-v] [-n] [-r] <pattern> [file...]"],
|
|
13
13
|
run: ({ authUser, shell, cwd, args, stdin }) => {
|
|
14
14
|
const { flags, positionals } = parseArgs(args, {
|
|
15
|
-
flags: ["-i", "-v", "-n", "-r"],
|
|
15
|
+
flags: ["-i", "-v", "-n", "-r", "-c", "-l", "-L", "-q", "--quiet", "--silent"],
|
|
16
16
|
});
|
|
17
17
|
const caseInsensitive = flags.has("-i");
|
|
18
18
|
const invertMatch = flags.has("-v");
|
|
19
19
|
const showLineNumbers = flags.has("-n");
|
|
20
20
|
const recursive = flags.has("-r");
|
|
21
|
+
const countOnly = flags.has("-c");
|
|
22
|
+
const filesWithMatches = flags.has("-l");
|
|
23
|
+
const quiet = flags.has("-q") || flags.has("--quiet") || flags.has("--silent");
|
|
21
24
|
const pattern = positionals[0];
|
|
22
25
|
const files = positionals.slice(1);
|
|
23
26
|
if (!pattern) {
|
|
@@ -72,7 +75,12 @@ export const grepCommand = {
|
|
|
72
75
|
if (files.length === 0) {
|
|
73
76
|
if (!stdin)
|
|
74
77
|
return { stdout: "", exitCode: 1 };
|
|
75
|
-
|
|
78
|
+
const matched = matchLines(stdin);
|
|
79
|
+
if (countOnly)
|
|
80
|
+
return { stdout: `${matched.length}\n`, exitCode: matched.length > 0 ? 0 : 1 };
|
|
81
|
+
if (quiet)
|
|
82
|
+
return { exitCode: matched.length > 0 ? 0 : 1 };
|
|
83
|
+
results.push(...matched);
|
|
76
84
|
}
|
|
77
85
|
else {
|
|
78
86
|
const resolvedPaths = files.flatMap((f) => {
|
|
@@ -84,7 +92,17 @@ export const grepCommand = {
|
|
|
84
92
|
assertPathAccess(authUser, filePath, "grep");
|
|
85
93
|
const content = shell.vfs.readFile(filePath);
|
|
86
94
|
const prefix = resolvedPaths.length > 1 ? `${file}:` : "";
|
|
87
|
-
|
|
95
|
+
const matched = matchLines(content, prefix);
|
|
96
|
+
if (countOnly) {
|
|
97
|
+
results.push(resolvedPaths.length > 1 ? `${file}:${matched.length}` : String(matched.length));
|
|
98
|
+
}
|
|
99
|
+
else if (filesWithMatches) {
|
|
100
|
+
if (matched.length > 0)
|
|
101
|
+
results.push(file);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
results.push(...matched);
|
|
105
|
+
}
|
|
88
106
|
}
|
|
89
107
|
catch {
|
|
90
108
|
return {
|
|
@@ -95,7 +113,7 @@ export const grepCommand = {
|
|
|
95
113
|
}
|
|
96
114
|
}
|
|
97
115
|
return {
|
|
98
|
-
stdout: results.length > 0 ? results.join("\n") : "",
|
|
116
|
+
stdout: results.length > 0 ? `${results.join("\n")}\n` : "",
|
|
99
117
|
exitCode: results.length > 0 ? 0 : 1,
|
|
100
118
|
};
|
|
101
119
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,aAAa,EAAE,WAW3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WAW3B,CAAC"}
|
package/dist/commands/groups.js
CHANGED
package/dist/commands/gzip.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { ShellModule } from "../types/commands";
|
|
2
2
|
/**
|
|
3
|
-
* Compress files using gzip
|
|
3
|
+
* Compress files using gzip — renames file to `<file>.gz`, removes original.
|
|
4
4
|
* @category archive
|
|
5
|
-
* @params ["<file>"]
|
|
6
5
|
*/
|
|
7
6
|
export declare const gzipCommand: ShellModule;
|
|
7
|
+
/**
|
|
8
|
+
* Decompress gzip files — renames `<file>.gz` to `<file>`, removes original.
|
|
9
|
+
* @category archive
|
|
10
|
+
*/
|
|
8
11
|
export declare const gunzipCommand: ShellModule;
|
|
9
12
|
//# sourceMappingURL=gzip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gzip.d.ts","sourceRoot":"","sources":["../../src/commands/gzip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD
|
|
1
|
+
{"version":3,"file":"gzip.d.ts","sourceRoot":"","sources":["../../src/commands/gzip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAyCzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,WA0B3B,CAAC"}
|
package/dist/commands/gzip.js
CHANGED
|
@@ -1,56 +1,76 @@
|
|
|
1
1
|
import { resolvePath } from "./helpers";
|
|
2
2
|
/**
|
|
3
|
-
* Compress files using gzip
|
|
3
|
+
* Compress files using gzip — renames file to `<file>.gz`, removes original.
|
|
4
4
|
* @category archive
|
|
5
|
-
* @params ["<file>"]
|
|
6
5
|
*/
|
|
7
6
|
export const gzipCommand = {
|
|
8
7
|
name: "gzip",
|
|
9
8
|
description: "Compress files",
|
|
10
9
|
category: "archive",
|
|
11
|
-
params: ["<file>"],
|
|
10
|
+
params: ["[-k] [-d] <file>"],
|
|
12
11
|
run: ({ shell, cwd, args }) => {
|
|
13
|
-
const
|
|
12
|
+
const keepOrig = args.includes("-k") || args.includes("--keep");
|
|
13
|
+
const decompress = args.includes("-d");
|
|
14
|
+
const file = args.find((a) => !a.startsWith("-"));
|
|
14
15
|
if (!file)
|
|
15
|
-
return { stderr: "gzip: no file specified", exitCode: 1 };
|
|
16
|
+
return { stderr: "gzip: no file specified\n", exitCode: 1 };
|
|
16
17
|
const p = resolvePath(cwd, file);
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
if (decompress) {
|
|
19
|
+
// gzip -d = gunzip
|
|
20
|
+
if (!file.endsWith(".gz")) {
|
|
21
|
+
return { stderr: `gzip: ${file}: unknown suffix -- ignored\n`, exitCode: 1 };
|
|
22
|
+
}
|
|
23
|
+
if (!shell.vfs.exists(p)) {
|
|
24
|
+
return { stderr: `gzip: ${file}: No such file or directory\n`, exitCode: 1 };
|
|
25
|
+
}
|
|
26
|
+
const content = shell.vfs.readFile(p);
|
|
27
|
+
const dest = p.slice(0, -3);
|
|
28
|
+
shell.vfs.writeFile(dest, content);
|
|
29
|
+
if (!keepOrig)
|
|
30
|
+
shell.vfs.remove(p);
|
|
19
31
|
return { exitCode: 0 };
|
|
20
32
|
}
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
stderr: `gzip: ${file}: No such file or directory`,
|
|
24
|
-
exitCode: 1,
|
|
25
|
-
};
|
|
33
|
+
if (!shell.vfs.exists(p)) {
|
|
34
|
+
return { stderr: `gzip: ${file}: No such file or directory\n`, exitCode: 1 };
|
|
26
35
|
}
|
|
36
|
+
if (file.endsWith(".gz")) {
|
|
37
|
+
return { stderr: `gzip: ${file}: already has .gz suffix -- unchanged\n`, exitCode: 1 };
|
|
38
|
+
}
|
|
39
|
+
const rawContent = shell.vfs.readFileRaw(p);
|
|
40
|
+
const gzPath = `${p}.gz`;
|
|
41
|
+
shell.vfs.writeFile(gzPath, rawContent, { compress: true });
|
|
42
|
+
if (!keepOrig)
|
|
43
|
+
shell.vfs.remove(p);
|
|
44
|
+
return { exitCode: 0 };
|
|
27
45
|
},
|
|
28
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* Decompress gzip files — renames `<file>.gz` to `<file>`, removes original.
|
|
49
|
+
* @category archive
|
|
50
|
+
*/
|
|
29
51
|
export const gunzipCommand = {
|
|
30
|
-
/**
|
|
31
|
-
* Decompress gzip files (or zcat alias).
|
|
32
|
-
* @category archive
|
|
33
|
-
* @params ["<file>"]
|
|
34
|
-
*/
|
|
35
52
|
name: "gunzip",
|
|
36
53
|
description: "Decompress files",
|
|
37
54
|
category: "archive",
|
|
38
|
-
params: ["<file>"],
|
|
39
55
|
aliases: ["zcat"],
|
|
56
|
+
params: ["[-k] <file>"],
|
|
40
57
|
run: ({ shell, cwd, args }) => {
|
|
41
|
-
const
|
|
58
|
+
const keepOrig = args.includes("-k") || args.includes("--keep");
|
|
59
|
+
const file = args.find((a) => !a.startsWith("-"));
|
|
42
60
|
if (!file)
|
|
43
|
-
return { stderr: "gunzip: no file specified", exitCode: 1 };
|
|
61
|
+
return { stderr: "gunzip: no file specified\n", exitCode: 1 };
|
|
44
62
|
const p = resolvePath(cwd, file);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return { exitCode: 0 };
|
|
63
|
+
if (!shell.vfs.exists(p)) {
|
|
64
|
+
return { stderr: `gunzip: ${file}: No such file or directory\n`, exitCode: 1 };
|
|
48
65
|
}
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
stderr: `gunzip: ${file}: No such file or directory`,
|
|
52
|
-
exitCode: 1,
|
|
53
|
-
};
|
|
66
|
+
if (!file.endsWith(".gz")) {
|
|
67
|
+
return { stderr: `gunzip: ${file}: unknown suffix -- ignored\n`, exitCode: 1 };
|
|
54
68
|
}
|
|
69
|
+
const content = shell.vfs.readFile(p);
|
|
70
|
+
const dest = p.slice(0, -3);
|
|
71
|
+
shell.vfs.writeFile(dest, content);
|
|
72
|
+
if (!keepOrig)
|
|
73
|
+
shell.vfs.remove(p);
|
|
74
|
+
return { exitCode: 0 };
|
|
55
75
|
},
|
|
56
76
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/commands/head.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/commands/head.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WA0CzB,CAAC"}
|
package/dist/commands/head.js
CHANGED
|
@@ -12,9 +12,18 @@ export const headCommand = {
|
|
|
12
12
|
params: ["[-n <lines>] [file...]"],
|
|
13
13
|
run: ({ authUser, shell, cwd, args, stdin }) => {
|
|
14
14
|
const nArg = getFlag(args, ["-n"]);
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
const
|
|
15
|
+
// Support both -n N and -N shorthand (head -2, head -10)
|
|
16
|
+
const shortN = args.find((a) => /^-\d+$/.test(a));
|
|
17
|
+
const n = typeof nArg === "string"
|
|
18
|
+
? parseInt(nArg, 10)
|
|
19
|
+
: shortN ? parseInt(shortN.slice(1), 10) : 10;
|
|
20
|
+
const positionals = args.filter((a) => !a.startsWith("-") && a !== nArg && a !== String(n));
|
|
21
|
+
const take = (content) => {
|
|
22
|
+
const lines = content.split("\n");
|
|
23
|
+
// Preserve trailing newline
|
|
24
|
+
const sliced = lines.slice(0, n);
|
|
25
|
+
return sliced.join("\n") + (content.endsWith("\n") && sliced.length === lines.slice(0, n).length ? "\n" : "");
|
|
26
|
+
};
|
|
18
27
|
if (positionals.length === 0) {
|
|
19
28
|
return { stdout: take(stdin ?? ""), exitCode: 0 };
|
|
20
29
|
}
|
package/dist/commands/htop.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"htop.d.ts","sourceRoot":"","sources":["../../src/commands/htop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,WAYzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"htop.d.ts","sourceRoot":"","sources":["../../src/commands/htop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAYzB,CAAC"}
|
package/dist/commands/htop.js
CHANGED
package/dist/commands/kill.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kill.d.ts","sourceRoot":"","sources":["../../src/commands/kill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,WAWzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"kill.d.ts","sourceRoot":"","sources":["../../src/commands/kill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAWzB,CAAC"}
|
package/dist/commands/kill.js
CHANGED
package/dist/commands/ln.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ln.d.ts","sourceRoot":"","sources":["../../src/commands/ln.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,eAAO,MAAM,SAAS,EAAE,WA4CvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ln.d.ts","sourceRoot":"","sources":["../../src/commands/ln.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,eAAO,MAAM,SAAS,EAAE,WA4CvB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,eAAe,EAAE,WAmB7B,CAAC"}
|
package/dist/commands/ln.js
CHANGED
|
@@ -42,3 +42,25 @@ export const lnCommand = {
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
};
|
|
45
|
+
/** Shell command: print the value of a symbolic link. */
|
|
46
|
+
export const readlinkCommand = {
|
|
47
|
+
name: "readlink",
|
|
48
|
+
description: "Print resolved path of symbolic link",
|
|
49
|
+
category: "files",
|
|
50
|
+
params: ["[-f] <path>"],
|
|
51
|
+
run: ({ shell, cwd, args }) => {
|
|
52
|
+
const follow = args.includes("-f") || args.includes("-e");
|
|
53
|
+
const target = args.find((a) => !a.startsWith("-"));
|
|
54
|
+
if (!target)
|
|
55
|
+
return { stderr: "readlink: missing operand\n", exitCode: 1 };
|
|
56
|
+
const p = resolvePath(cwd, target);
|
|
57
|
+
if (!shell.vfs.exists(p)) {
|
|
58
|
+
return { stderr: `readlink: ${target}: No such file or directory\n`, exitCode: 1 };
|
|
59
|
+
}
|
|
60
|
+
if (!shell.vfs.isSymlink(p)) {
|
|
61
|
+
return { stderr: `readlink: ${target}: not a symbolic link\n`, exitCode: 1 };
|
|
62
|
+
}
|
|
63
|
+
const resolved = shell.vfs.resolveSymlink(follow ? p : p);
|
|
64
|
+
return { stdout: `${resolved}\n`, exitCode: 0 };
|
|
65
|
+
},
|
|
66
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD,eAAO,MAAM,SAAS,EAAE,WA6CvB,CAAC"}
|
package/dist/commands/ls.js
CHANGED
|
@@ -34,6 +34,21 @@ export const lsCommand = {
|
|
|
34
34
|
});
|
|
35
35
|
const target = resolvePath(cwd, targetArg ?? cwd);
|
|
36
36
|
assertPathAccess(authUser, target, "ls");
|
|
37
|
+
// If target is a file, show its info directly (ls -l /etc/passwd)
|
|
38
|
+
if (shell.vfs.exists(target)) {
|
|
39
|
+
const st = shell.vfs.stat(target);
|
|
40
|
+
if (st.type === "file" || shell.vfs.isSymlink(target)) {
|
|
41
|
+
if (longFormat) {
|
|
42
|
+
const name = target.split("/").pop() ?? target;
|
|
43
|
+
const size = st.type === "file" ? st.size : 0;
|
|
44
|
+
return {
|
|
45
|
+
stdout: `${formatPermissions(st.mode, false)} 1 root root ${size} ${formatDate(st.updatedAt)} ${name}\n`,
|
|
46
|
+
exitCode: 0,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { stdout: target.split("/").pop() ?? target, exitCode: 0 };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
37
52
|
const items = shell.vfs
|
|
38
53
|
.list(target)
|
|
39
54
|
.filter((name) => showHidden || !name.startsWith("."));
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { ShellModule } from "../types/commands";
|
|
2
|
+
/**
|
|
3
|
+
* Print Linux distribution information.
|
|
4
|
+
* @category system
|
|
5
|
+
* @params ["[-a] [-i] [-d] [-r] [-c]"]
|
|
6
|
+
*/
|
|
2
7
|
export declare const lsbReleaseCommand: ShellModule;
|
|
3
8
|
//# sourceMappingURL=lsb-release.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsb-release.d.ts","sourceRoot":"","sources":["../../src/commands/lsb-release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,eAAO,MAAM,iBAAiB,EAAE,WAsD/B,CAAC"}
|
|
1
|
+
{"version":3,"file":"lsb-release.d.ts","sourceRoot":"","sources":["../../src/commands/lsb-release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAsD/B,CAAC"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { ifFlag } from "./command-helpers";
|
|
2
|
+
/**
|
|
3
|
+
* Print Linux distribution information.
|
|
4
|
+
* @category system
|
|
5
|
+
* @params ["[-a] [-i] [-d] [-r] [-c]"]
|
|
6
|
+
*/
|
|
2
7
|
export const lsbReleaseCommand = {
|
|
3
8
|
name: "lsb_release",
|
|
4
9
|
description: "Print distribution-specific information",
|
package/dist/commands/mkdir.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mkdir.d.ts","sourceRoot":"","sources":["../../src/commands/mkdir.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,eAAO,MAAM,YAAY,EAAE,WAqB1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"mkdir.d.ts","sourceRoot":"","sources":["../../src/commands/mkdir.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAqB1B,CAAC"}
|
package/dist/commands/mkdir.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { getArg } from "./command-helpers";
|
|
2
2
|
import { assertPathAccess, resolvePath } from "./helpers";
|
|
3
|
+
/**
|
|
4
|
+
* Create one or more directories.
|
|
5
|
+
* @category files
|
|
6
|
+
* @params ["<dir>"]
|
|
7
|
+
*/
|
|
3
8
|
export const mkdirCommand = {
|
|
4
9
|
name: "mkdir",
|
|
5
10
|
description: "Make directories",
|
package/dist/commands/mv.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mv.d.ts","sourceRoot":"","sources":["../../src/commands/mv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,eAAO,MAAM,SAAS,EAAE,WAyCvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"mv.d.ts","sourceRoot":"","sources":["../../src/commands/mv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,WAyCvB,CAAC"}
|
package/dist/commands/mv.js
CHANGED
package/dist/commands/nano.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nano.d.ts","sourceRoot":"","sources":["../../src/commands/nano.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,eAAO,MAAM,WAAW,EAAE,WA4BzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"nano.d.ts","sourceRoot":"","sources":["../../src/commands/nano.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WA4BzB,CAAC"}
|
package/dist/commands/nano.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import * as path from "node:path";
|
|
2
2
|
import { assertPathAccess, resolvePath } from "./helpers";
|
|
3
|
+
/**
|
|
4
|
+
* Simple text editor for editing files.
|
|
5
|
+
* @category files
|
|
6
|
+
* @params ["<file>"]
|
|
7
|
+
*/
|
|
3
8
|
export const nanoCommand = {
|
|
4
9
|
name: "nano",
|
|
5
10
|
description: "Text editor",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neofetch.d.ts","sourceRoot":"","sources":["../../src/commands/neofetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"neofetch.d.ts","sourceRoot":"","sources":["../../src/commands/neofetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,WAoC7B,CAAC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { buildNeofetchOutput } from "../modules/neofetch";
|
|
2
2
|
import { ifFlag } from "./command-helpers";
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Display system information in a decorative format.
|
|
5
|
+
* @category system
|
|
6
|
+
* @params ["[--off]"]
|
|
7
|
+
*/
|
|
4
8
|
export const neofetchCommand = {
|
|
5
9
|
name: "neofetch",
|
|
6
10
|
description: "System info display",
|
|
7
11
|
category: "system",
|
|
8
12
|
params: ["[--off]"],
|
|
9
|
-
run: ({ args, authUser, hostname, shell }) => {
|
|
10
|
-
const env = getAllEnvVars(authUser);
|
|
13
|
+
run: ({ args, authUser, hostname, shell, env }) => {
|
|
11
14
|
if (ifFlag(args, "--help")) {
|
|
12
15
|
return {
|
|
13
16
|
stdout: "Usage: neofetch [--off]",
|
|
@@ -24,9 +27,9 @@ export const neofetchCommand = {
|
|
|
24
27
|
stdout: buildNeofetchOutput({
|
|
25
28
|
user: authUser,
|
|
26
29
|
host: hostname,
|
|
27
|
-
shell: env.SHELL,
|
|
30
|
+
shell: env.vars.SHELL,
|
|
28
31
|
shellProps: shell.properties,
|
|
29
|
-
terminal: env.TERM,
|
|
32
|
+
terminal: env.vars.TERM,
|
|
30
33
|
uptimeSeconds: Math.floor((Date.now() - shell.startTime) / 1000),
|
|
31
34
|
packages: (() => {
|
|
32
35
|
const count = shell.packageManager?.installedCount() ?? 0;
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import type { ShellModule } from "../types/commands";
|
|
2
|
+
/**
|
|
3
|
+
* `passwd [username]` — change a virtual user's password.
|
|
4
|
+
*
|
|
5
|
+
* - Root can change any user's password.
|
|
6
|
+
* - Non-root can only change their own password.
|
|
7
|
+
* - Interactive: emits `passwordChallenge` for hidden-input prompting.
|
|
8
|
+
* - Non-interactive: reads new password from stdin first line.
|
|
9
|
+
*/
|
|
2
10
|
export declare const passwdCommand: ShellModule;
|
|
3
11
|
//# sourceMappingURL=passwd.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passwd.d.ts","sourceRoot":"","sources":["../../src/commands/passwd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"passwd.d.ts","sourceRoot":"","sources":["../../src/commands/passwd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,WAuC3B,CAAC"}
|
package/dist/commands/passwd.js
CHANGED
|
@@ -1,22 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `passwd [username]` — change a virtual user's password.
|
|
3
|
+
*
|
|
4
|
+
* - Root can change any user's password.
|
|
5
|
+
* - Non-root can only change their own password.
|
|
6
|
+
* - Interactive: emits `passwordChallenge` for hidden-input prompting.
|
|
7
|
+
* - Non-interactive: reads new password from stdin first line.
|
|
8
|
+
*/
|
|
1
9
|
export const passwdCommand = {
|
|
2
10
|
name: "passwd",
|
|
3
11
|
description: "Change user password",
|
|
4
12
|
category: "users",
|
|
5
|
-
params: ["
|
|
6
|
-
run: async ({ authUser, args, shell }) => {
|
|
7
|
-
const [
|
|
8
|
-
|
|
13
|
+
params: ["[username]"],
|
|
14
|
+
run: async ({ authUser, args, shell, stdin }) => {
|
|
15
|
+
const targetUser = args[0] ?? authUser;
|
|
16
|
+
// Permission check
|
|
17
|
+
if (authUser !== "root" && authUser !== targetUser) {
|
|
18
|
+
return { stderr: "passwd: permission denied", exitCode: 1 };
|
|
19
|
+
}
|
|
20
|
+
// Target must exist
|
|
21
|
+
if (!shell.users.listUsers().includes(targetUser)) {
|
|
22
|
+
return { stderr: `passwd: user '${targetUser}' does not exist`, exitCode: 1 };
|
|
23
|
+
}
|
|
24
|
+
// Non-interactive: read new password from stdin
|
|
25
|
+
if (stdin !== undefined && stdin.trim().length > 0) {
|
|
26
|
+
const password = stdin.trim().split("\n")[0];
|
|
27
|
+
await shell.users.setPassword(targetUser, password);
|
|
9
28
|
return {
|
|
10
|
-
|
|
11
|
-
exitCode:
|
|
29
|
+
stdout: `passwd: password updated successfully\n`,
|
|
30
|
+
exitCode: 0,
|
|
12
31
|
};
|
|
13
32
|
}
|
|
14
|
-
|
|
15
|
-
return { stderr: "passwd: permission denied", exitCode: 1 };
|
|
16
|
-
}
|
|
17
|
-
await shell.users.setPassword(username, password);
|
|
33
|
+
// Interactive: emit password challenge
|
|
18
34
|
return {
|
|
19
|
-
|
|
35
|
+
passwordChallenge: {
|
|
36
|
+
prompt: "New password: ",
|
|
37
|
+
confirmPrompt: "Retype new password: ",
|
|
38
|
+
action: "passwd",
|
|
39
|
+
targetUsername: targetUser,
|
|
40
|
+
},
|
|
20
41
|
exitCode: 0,
|
|
21
42
|
};
|
|
22
43
|
},
|
package/dist/commands/ping.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { ShellModule } from "../types/commands";
|
|
2
|
+
/**
|
|
3
|
+
* Send ICMP ECHO_REQUEST packets (mock implementation).
|
|
4
|
+
* @category network
|
|
5
|
+
* @params ["[-c <count>] <host>"]
|
|
6
|
+
*/
|
|
2
7
|
export declare const pingCommand: ShellModule;
|
|
3
8
|
//# sourceMappingURL=ping.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/commands/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,eAAO,MAAM,WAAW,EAAE,WAuBzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/commands/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAuBzB,CAAC"}
|