35a8a07152
Client (sic) frames argv as netstrings and pipes it over ssh to a daemon (sicd) that execvp's it, so no shell re-parses the arguments. exec mode by default; opt-in sh mode for pipes/redirects/globs. Go client + daemon, Python reference daemon, design doc, quoting-hell demo, and foreground/background agent skills. Renamed from the climcp prototype. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EWpfhDgYNA21tETDP9ueBE
1.5 KiB
1.5 KiB
name, description
| name | description |
|---|---|
| sic | Run a command on a remote host without shell quoting bugs. Lighter than a per-host MCP server. |
sic — remote command execution
sic <host> <command> [arg ...] runs the command on <host>. Arguments go to
sicd on the host as netstrings and are passed to execvp directly, so no
shell re-parses them. ssh host touch 'a b' makes two files; sic host touch 'a b' makes one file named a b.
Usage
sic <host> <command> [arg ...] # exec mode (default)
sic --sh <host> '<shell string>' # sh -c on the host
sic <host> -- <command> [arg ...] # explicit separator if host/command starts with --
Pass each argument as a separate argument to sic. Do not construct netstrings;
sic frames them.
sic quotesu echo hello world
sic quotesu touch 'my file.txt'
sic quotesu echo '$HOME' # literal, no expansion
sic quotesu python3 -c 'import sys; print(sys.argv)' a 'b c'
sic --sh quotesu 'grep foo *.log | wc -l'
exec vs --sh
- Default (exec): a program with arguments. Quoting cannot break, but there are no pipes, redirects, or globs.
--sh: use only when you need a pipe, redirect, or glob. The single string is parsed bysh -con the host.
Deploy sicd to a new host
scp gateway/sicd <host>:/tmp/sicd # Python reference; or bin/sicd (Go)
sic --sh <host> 'sudo install -m755 /tmp/sicd /usr/local/bin/sicd'
sic <host> id # verify
For long-running commands, use the background skill (SKILL-bg.md).