diff --git a/Dockerfile b/Dockerfile index 6c7228b..6e6682e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,13 +3,15 @@ WORKDIR /usr/src/app RUN apk add --update build-base python COPY . /usr/src/app RUN yarn - FROM node:8-alpine MAINTAINER butlerx@notthe.cloud WORKDIR /app RUN adduser -D -h /home/term -s /bin/sh term && \ ( echo "term:term" | chpasswd ) && \ - apk add openssh-client + apk add openssh-client && \ + apk add sshpass +USER term EXPOSE 3000 COPY --from=builder /usr/src/app /app -CMD node bin +RUN mkdir ~/.ssh +CMD ssh-keyscan -H wetty-ssh >> ~/.ssh/known_hosts && node bin diff --git a/Dockerfile-ssh b/Dockerfile-ssh new file mode 100644 index 0000000..317de63 --- /dev/null +++ b/Dockerfile-ssh @@ -0,0 +1,3 @@ +FROM sickp/alpine-sshd:latest +RUN adduser -D -h /home/term -s /bin/sh term && \ + ( echo "term:term" | chpasswd ) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 310fd8f..3161613 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: "3" +version: "3.5" services: wetty: @@ -11,5 +11,16 @@ services: - "3000:3000" environment: PORT: 3000 - SSHHOST: 'localhost' + SSHHOST: 'wetty-ssh' SSHPORT: 22 + wetty-ssh: + build: + context: . + dockerfile: Dockerfile-ssh + container_name: 'wetty-ssh' + +networks: + default: + name: wetty + + diff --git a/wetty.mjs b/wetty.mjs index b9f2e9a..4a9a194 100644 --- a/wetty.mjs +++ b/wetty.mjs @@ -40,17 +40,11 @@ function createServer(port, sslopts) { function getCommand(socket, sshuser, sshpass, sshhost, sshport, sshauth, sshkey) { const { request } = socket; const match = request.headers.referer.match('.+/ssh/.+$'); - console.log("Match ", match); - console.log("user ", sshuser); const sshAddress = sshuser ? `${sshuser}@${sshhost}` : sshhost; - console.log("Address ", sshAddress); const referer = url.parse(request.headers.referer, true); sshpass = referer.query.sshpass ? referer.query.sshpass : sshpass; - console.log("PASS ", sshpass); let sshPath = sshuser || match ? 'ssh' : path.join(__dirname, 'bin/ssh'); - console.log("PATH ", sshPath); const ssh = match ? `${match[0].split('/ssh/').pop().split('?')[0]}@${sshhost}` : sshAddress; - console.log("SSH ", ssh); const sshRemoteOptsBase = [ sshPath, ssh, @@ -62,11 +56,11 @@ function getCommand(socket, sshuser, sshpass, sshhost, sshport, sshauth, sshkey) let sshRemoteOpts; if (sshkey) - sshRemoteOpts = sshRemoteOptsBase.concat(['-i', sshkey]) + sshRemoteOpts = sshRemoteOptsBase.concat(['-i', sshkey]); else if (sshpass) - sshRemoteOpts = ['sshpass', '-p', sshpass].concat(sshRemoteOptsBase) - - console.log(sshRemoteOpts); + sshRemoteOpts = ['sshpass', '-p', sshpass].concat(sshRemoteOptsBase); + else + sshRemoteOpts = sshRemoteOptsBase; return [ process.getuid() === 0 && sshhost === 'localhost' ? ['login', '-h', socket.client.conn.remoteAddress.split(':')[3]] @@ -77,13 +71,11 @@ function getCommand(socket, sshuser, sshpass, sshhost, sshport, sshauth, sshkey) } export default function start(port, sshuser, sshpass, sshhost, sshport, sshauth, sshkey, sslopts) { - console.log("START", port, sshuser, sshpass, sshhost, sshport, sshauth, sshkey, sslopts); const events = new EventEmitter(); const io = server(createServer(port, sslopts), { path: '/wetty/socket.io' }); io.on('connection', socket => { console.log(`${new Date()} Connection accepted.`); const [args, ssh] = getCommand(socket, sshuser, sshpass, sshhost, sshport, sshauth, sshkey); - console.log("PIKA PIKA", args, ssh); const term = spawn('/usr/bin/env', args, { name: 'xterm-256color', cols: 80,