"ruderich.org/simon/safcm/remote"
)
-func (c *Conn) DialSSH(user, host string) error {
+func (c *Conn) DialSSH(user, host, sshConfig string) error {
if c.events == nil {
return fmt.Errorf("cannot reuse Conn")
}
// Help debugging by showing executed shell commands
opts += "x"
}
- c.cmd = exec.Command("ssh", remote, "/bin/sh", opts)
- c.remote = remote
+
+ c.sshRemote = remote
+ if sshConfig != "" {
+ c.sshOpts = []string{"-F", sshConfig}
+ }
+ c.cmd = exec.Command("ssh",
+ append(append([]string{}, c.sshOpts...),
+ c.sshRemote, "/bin/sh", opts)...)
stdin, err := c.cmd.StdinPipe()
if err != nil {
//
// The target directory must no permit other users to delete our files
// or symlink attacks and arbitrary code execution is possible. For
- // /tmp this is guaranteed by the sticky bit. Make sure it has the
- // proper permissions.
+ // /tmp this is guaranteed by the sticky bit. The code verifies the
+ // directory has the proper permissions.
//
// We cannot use `test -f && test -O` because this is open to TOCTOU
// attacks. `stat` gives use the full file state. If the file is owned
- // by us and not a symlink then it's safe to use (assuming sticky or
- // directory not writable by others).
+ // by us and not a symlink then it's safe to use (assuming sticky
+ // directory or directory not writable by others).
//
// `test -e` is only used to prevent error messages if the file
// doesn't exist. It does not guard against any races.
tmp="$(mktemp "$x.XXXXXX")"
# Report filename for upload
echo "$tmp"
-
# Wait for upload to complete
read unused
rm "$tmp"
# Make file executable
chmod 0700 "$x"
+ # Some BSD create files with group wheel in /tmp
+ chgrp "$(id -g)" "$x"
fi
exec "$x" sync
path = strings.TrimSuffix(path, "\n")
c.debugf("DialSSH: uploading new remote to %q at %q",
- c.remote, path)
+ c.sshRemote, path)
- cmd := exec.Command("ssh", c.remote,
- fmt.Sprintf("cat > %q", path))
+ cmd := exec.Command("ssh",
+ append(append([]string{}, c.sshOpts...),
+ c.sshRemote,
+ fmt.Sprintf("cat > %q", path))...)
cmd.Stdin = bytes.NewReader(helper)
- err = c.handleStderrAsEvents(cmd)
+ err = c.handleStderrAsEvents(cmd) // cmd.Stderr
if err != nil {
return err
}