mirror of https://gogs.blitter.com/RLabs/xs
Merge branch 'hkexcp-proto' of ssh://tripe.blitter.com/var/git/hkexsh into hkexcp-proto
This commit is contained in:
commit
5920e06748
108
hkexsh/hkexsh.go
108
hkexsh/hkexsh.go
|
@ -34,7 +34,8 @@ type cmdSpec struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
|
defPort = "2000"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get terminal size using 'stty' command
|
// Get terminal size using 'stty' command
|
||||||
|
@ -52,6 +53,55 @@ func GetSize() (cols, rows int, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseNonSwitchArgs(a []string, dp string) (user, host, port, path string, isDest bool, otherArgs []string) {
|
||||||
|
//TODO: Look for non-option fancyArg of syntax user@host:filespec to set -r,-t and -u
|
||||||
|
// Consider: whether fancyArg is src or dst file depends on flag.Args() index;
|
||||||
|
// fancyArg as last flag.Args() element denotes dstFile
|
||||||
|
// fancyArg as not-last flag.Args() element denotes srcFile
|
||||||
|
// * throw error if >1 fancyArgs are found in flags.Args()
|
||||||
|
var fancyUser, fancyHost, fancyPort, fancyPath string
|
||||||
|
for i, arg := range a {
|
||||||
|
if strings.Contains(arg, ":") || strings.Contains(arg, "@") {
|
||||||
|
fancyArg := strings.Split(flag.Arg(i), "@")
|
||||||
|
var fancyHostPortPath []string
|
||||||
|
if len(fancyArg) < 2 {
|
||||||
|
//TODO: no user specified, use current
|
||||||
|
fancyUser = "[default:getUser]"
|
||||||
|
fancyHostPortPath = strings.Split(fancyArg[0], ":")
|
||||||
|
} else {
|
||||||
|
// user@....
|
||||||
|
fancyUser = fancyArg[0]
|
||||||
|
fancyHostPortPath = strings.Split(fancyArg[1], ":")
|
||||||
|
}
|
||||||
|
|
||||||
|
// [...@]host[:port[:path]]
|
||||||
|
if len(fancyHostPortPath) > 2 {
|
||||||
|
fancyPath = fancyHostPortPath[2]
|
||||||
|
} else if len(fancyHostPortPath) > 1 {
|
||||||
|
fancyPort = fancyHostPortPath[1]
|
||||||
|
}
|
||||||
|
fancyHost = fancyHostPortPath[0]
|
||||||
|
|
||||||
|
if fancyPort == "" {
|
||||||
|
fancyPort = dp
|
||||||
|
}
|
||||||
|
|
||||||
|
if fancyPath == "" {
|
||||||
|
fancyPath = "."
|
||||||
|
}
|
||||||
|
|
||||||
|
if i == len(a)-1 {
|
||||||
|
isDest = true
|
||||||
|
fmt.Println("isDest")
|
||||||
|
}
|
||||||
|
fmt.Println("fancyArgs: user:", fancyUser, "host:", fancyHost, "port:", fancyPort, "path:", fancyPath)
|
||||||
|
} else {
|
||||||
|
otherArgs = append(otherArgs, a[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fancyUser, fancyHost, fancyPort, fancyPath, isDest, otherArgs
|
||||||
|
}
|
||||||
|
|
||||||
// Demo of a simple client that dials up to a simple test server to
|
// Demo of a simple client that dials up to a simple test server to
|
||||||
// send data.
|
// send data.
|
||||||
//
|
//
|
||||||
|
@ -73,7 +123,7 @@ func main() {
|
||||||
var server string
|
var server string
|
||||||
var cmdStr string
|
var cmdStr string
|
||||||
|
|
||||||
var copySrc string
|
var copySrc []byte
|
||||||
var copyDst string
|
var copyDst string
|
||||||
|
|
||||||
var altUser string
|
var altUser string
|
||||||
|
@ -90,29 +140,61 @@ func main() {
|
||||||
flag.BoolVar(&dbg, "d", false, "debug logging")
|
flag.BoolVar(&dbg, "d", false, "debug logging")
|
||||||
flag.StringVar(&cAlg, "c", "C_AES_256", "cipher [\"C_AES_256\" | \"C_TWOFISH_128\" | \"C_BLOWFISH_64\"]")
|
flag.StringVar(&cAlg, "c", "C_AES_256", "cipher [\"C_AES_256\" | \"C_TWOFISH_128\" | \"C_BLOWFISH_64\"]")
|
||||||
flag.StringVar(&hAlg, "m", "H_SHA256", "hmac [\"H_SHA256\"]")
|
flag.StringVar(&hAlg, "m", "H_SHA256", "hmac [\"H_SHA256\"]")
|
||||||
flag.StringVar(&server, "s", "localhost:2000", "server hostname/address[:port]")
|
flag.StringVar(&server, "s", "localhost:"+defPort, "server hostname/address[:port]")
|
||||||
flag.StringVar(&altUser, "u", "", "specify alternate user")
|
flag.StringVar(&altUser, "u", "", "specify alternate user")
|
||||||
flag.StringVar(&authCookie, "a", "", "auth cookie")
|
flag.StringVar(&authCookie, "a", "", "auth cookie")
|
||||||
flag.BoolVar(&chaffEnabled, "e", true, "enabled chaff pkts (default true)")
|
flag.BoolVar(&chaffEnabled, "e", true, "enabled chaff pkts (default true)")
|
||||||
flag.UintVar(&chaffFreqMin, "f", 100, "chaff pkt freq min (msecs)")
|
flag.UintVar(&chaffFreqMin, "f", 100, "chaff pkt freq min (msecs)")
|
||||||
flag.UintVar(&chaffFreqMax, "F", 5000, "chaff pkt freq max (msecs)")
|
flag.UintVar(&chaffFreqMax, "F", 5000, "chaff pkt freq max (msecs)")
|
||||||
flag.UintVar(&chaffBytesMax, "B", 64, "chaff pkt size max (bytes)")
|
flag.UintVar(&chaffBytesMax, "B", 64, "chaff pkt size max (bytes)")
|
||||||
|
|
||||||
// Find out what program we are (shell or copier)
|
// Find out what program we are (shell or copier)
|
||||||
myPath := strings.Split(os.Args[0], string(os.PathSeparator))
|
myPath := strings.Split(os.Args[0], string(os.PathSeparator))
|
||||||
if myPath[len(myPath)-1] != "hkexcp" {
|
if myPath[len(myPath)-1] != "hkexcp" && myPath[len(myPath)-1] != "hkexcp.exe" {
|
||||||
// hkexsh accepts a command (-x) but not
|
// hkexsh accepts a command (-x) but not
|
||||||
// a srcpath (-r) or dstpath (-t)
|
// a srcpath (-r) or dstpath (-t)
|
||||||
flag.StringVar(&cmdStr, "x", "", "command to run (default empty - interactive shell)")
|
flag.StringVar(&cmdStr, "x", "", "command to run (default empty - interactive shell)")
|
||||||
flag.Parse()
|
} // else {
|
||||||
} else {
|
//// hkexcp accepts srcpath (-r) and dstpath (-t), but not
|
||||||
// hkexcp accepts srcpath (-r) and dstpath (-t), but not
|
//// a command (-x)
|
||||||
// a command (-x)
|
//flag.StringVar(©Src, "r", "", "copy srcpath")
|
||||||
flag.StringVar(©Src, "r", "", "copy srcpath")
|
//flag.StringVar(©Dst, "t", "", "copy dstpath")
|
||||||
flag.StringVar(©Dst, "t", "", "copy dstpath")
|
//}
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
fancyUser, fancyHost, fancyPort, fancyPath, pathIsDest, otherArgs :=
|
||||||
|
parseNonSwitchArgs(flag.Args(), defPort /* defPort */)
|
||||||
|
fmt.Println("otherArgs:", otherArgs)
|
||||||
|
//fmt.Println("fancyHost:", fancyHost)
|
||||||
|
fmt.Println("fancyPath:", fancyPath)
|
||||||
|
if fancyUser != "" {
|
||||||
|
altUser = fancyUser
|
||||||
|
}
|
||||||
|
if fancyHost != "" {
|
||||||
|
server = fancyHost + ":" + fancyPort
|
||||||
|
//fmt.Println("fancyHost sets server to", server)
|
||||||
|
}
|
||||||
|
if fancyPath != "" {
|
||||||
|
// -if pathIsSrc && len(otherArgs) > 1 ERROR
|
||||||
|
// -else flatten otherArgs into space-delim list => copySrc
|
||||||
|
if pathIsDest {
|
||||||
|
for _, v := range otherArgs {
|
||||||
|
copySrc = append(copySrc, ' ')
|
||||||
|
copySrc = append(copySrc, v...)
|
||||||
|
}
|
||||||
|
fmt.Println(">> copySrc:", string(copySrc))
|
||||||
|
copyDst = fancyPath
|
||||||
|
} else {
|
||||||
|
if len(otherArgs) > 1 {
|
||||||
|
log.Fatal("ERROR: cannot specify more than one dest path for copy")
|
||||||
|
}
|
||||||
|
copySrc = []byte(fancyPath)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if flag.NFlag() == 0 {
|
//fmt.Println("server finally is:", server)
|
||||||
|
|
||||||
|
if flag.NFlag() == 0 && server == "" {
|
||||||
flag.Usage()
|
flag.Usage()
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
@ -123,7 +205,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cmdStr) != 0 && (len(copySrc) != 0 || len(copyDst) != 0) {
|
if len(cmdStr) != 0 && (len(copySrc) != 0 || len(copyDst) != 0) {
|
||||||
log.Fatal("incompatible options -- either cmd (-x) or copy ops (-r,-t), but not both")
|
log.Fatal("incompatible options -- either cmd (-x) or copy ops but not both")
|
||||||
}
|
}
|
||||||
|
|
||||||
if dbg {
|
if dbg {
|
||||||
|
|
Loading…
Reference in New Issue