#!/bin/bash # Copyright (C) 2019 Ian Kelling # SPDX-License-Identifier: AGPL-3.0-or-later # to debug #set -x # redirect output to log file. this doesn't work. todo figure out why #exec 1>>/a/tmp/bashlog #exec 2>>/a/tmp/bashlog # By default this file is sourced for ALL ssh commands. This is wonky. # Normally, this file is not sourced when a script is run, but we can # override that by having #!/bin/bash -l. I want something similar for ssh # commands. when a local script runs an ssh command, this file should not be # sourced by default, but we should be able to override that. # # So here we test for conditions of a script under ssh and return if so. # And we don't keep the rest of the code in this file, because even # though we return, we already parsed the whole code, and as I develop # the code, the parsing can have errors, which can screw up cronjobs # etc. # # To test for an overriding condition, we have a few options. one is to # use an environment variable. env variables sent across ssh are # strictly limited. ssh -t which sets $SSH_TTY, but within a script that # won't work because tty allocation will fail. However, I do use -t for # strange hosts, so we consider it an indicator. We could override an # obscure unused LC_var, like telephone, but I don't want to run into # some edge case where that messes things up. we could transfer a file # which we could test for, but I can't think of a way to make that # inherently limited to a single ssh command. I choose to set SendEnv # and AcceptEnv ssh config vars to allow the environment variable # BASH_LOGIN_SHELL to propagate across ssh. This also requires that we # wrap ssh in interactive shells, because, once we export the var, it # will go into scripts, and we want it to be nondefault there. # # -c is set whenever a command is passed to ssh # -i is set whenever a command is not passed if [[ $SSH_CONNECTION ]] \ && [[ $- == *c* ]] \ && [[ $- != *i* ]] \ && { [[ ! $SSH_TTY ]] || [[ $BASH_LOGIN_SHELL == false ]] ; } ; then return 0 else # the distinction between login and non-login shells is lame, # get rid of it. note ssh shells normally its login if a command is passed if ! shopt -q login_shell; then if [[ -r /etc/profile ]]; then source /etc/profile fi # note, this is not exactly the same as a login shell, because that # reads ~/.bash_profile or alternative, which usually just sources # this file, and we don't want to do that and cause an infinite # loop. fi _tmp=$(readlink -f ${BASH_SOURCE[0]}) _tmp=${_tmp%/*} _tmp2=$_tmp/brc if [[ -s $_tmp2 ]]; then # shellcheck source=./brc source $_tmp2 fi # brc2 is for things i dont necessarily want on every system _tmp2=$_tmp/brc2 if [[ -s $_tmp2 ]]; then # shellcheck source=./brc2 source $_tmp2 else # This check is for when running the sl() command, # and the remote host got its type misidentified. _tmp2=$_tmp/../brc2 if [[ -s $_tmp2 ]]; then # shellcheck source=./brc2 source $_tmp2 fi fi fi # ensure no bad programs appending to this file will have an affect return 0