/usr/bin
NameSizeModeActions
aclocal363760755editdlrm
aclocal-1.16363760755editdlrm
addr2line284080755editdlrm
agentxtrap279600755editdlrm
animate154560755editdlrm
ar573280755editdlrm
arch322240755editdlrm
arpaname154720755editdlrm
as7273600755editdlrm
aspell1547440755editdlrm
at60090755editdlrm
atq60110755editdlrm
atrm60130755editdlrm
autoconf147710755editdlrm
autoheader85340755editdlrm
autom4te321810755editdlrm
automake2579810755editdlrm
automake-1.162579810755editdlrm
autoreconf210660755editdlrm
autoscan171240755editdlrm
autoupdate338720755editdlrm
awk7149280755editdlrm
b2sum528320755editdlrm
base32363440755editdlrm
base64363440755editdlrm
basename322400755editdlrm
basenc489760755editdlrm
bash13890240755editdlrm
bashbug-6470790755editdlrm
batch1400755editdlrm
bison5066320755editdlrm
bunzip2403920755editdlrm
bzcat403920755editdlrm
bzcmp21440755editdlrm
bzdiff21440755editdlrm
bzgrep20580755editdlrm
bzip2403920755editdlrm
bzip2recover155920755editdlrm
bzless12630755editdlrm
bzmore12630755editdlrm
c++10972240755editdlrm
c++filt278400755editdlrm
c892280755editdlrm
c992190755editdlrm
cagefs_enter.proxied60290755editdlrm
cal530640755editdlrm
captoinfo898960755editdlrm
cat363120755editdlrm
catchsegv32890755editdlrm
cc10931280755editdlrm
chcon614880755editdlrm
chgrp573200755editdlrm
chmod573040755editdlrm
chown614320755editdlrm
chrt279600755editdlrm
cksum321360755editdlrm
cldetect112220755editdlrm
clear155120755editdlrm
cloudlinux-awp-user18180755editdlrm
clwpos-user18180755editdlrm
cmp410960755editdlrm
col237920755editdlrm
colcrt155520755editdlrm
colrm155280755editdlrm
column361840755editdlrm
comm364080755editdlrm
compare154560755editdlrm
composite154560755editdlrm
conjure154640755editdlrm
convert154640755editdlrm
cp1444000755editdlrm
cpan85710755editdlrm
cpp10972240755editdlrm
crontab58260755editdlrm
crontab.cagefs414400755editdlrm
csplit1112720755editdlrm
curl2544560755editdlrm
cut446560755editdlrm
cyrusbdb2current16518240755editdlrm
date1063360755editdlrm
dbiprof62060755editdlrm
dd695760755editdlrm
delv455440755editdlrm
df824640755editdlrm
diff1993680755editdlrm
diff3535600755editdlrm
dig1398720755editdlrm
dir1407520755editdlrm
dircolors405680755editdlrm
dirname279520755editdlrm
display154560755editdlrm
dnstap-read237440755editdlrm
du1528480755editdlrm
echo279440755editdlrm
ed537680755editdlrm
egrep320755editdlrm
enc2xs416630755editdlrm
enchant242960755editdlrm
enchant-lsmod161840755editdlrm
env450880755editdlrm
eps2eps6430755editdlrm
eqn1940640755editdlrm
ex14522560755editdlrm
expand404880755editdlrm
expr1110400755editdlrm
factor735920755editdlrm
false279360755editdlrm
fc-cache1390755editdlrm
fc-cache-64237280755editdlrm
fc-cat196160755editdlrm
fc-conflist154960755editdlrm
fc-list154960755editdlrm
fc-match154960755editdlrm
fc-pattern155040755editdlrm
fc-query154960755editdlrm
fc-scan155040755editdlrm
fc-validate155040755editdlrm
fgrep320755editdlrm
file282880755editdlrm
find2917920755editdlrm
flex4225440755editdlrm
flex++4225440755editdlrm
flock239280755editdlrm
fmt405280755editdlrm
fold404560755editdlrm
free239200755editdlrm
freetype-config44230755editdlrm
funzip320000755editdlrm
g++10972240755editdlrm
gawk7149280755editdlrm
gcc10931280755editdlrm
gcc-ar283360755editdlrm
gcc-nm283120755editdlrm
gcc-ranlib283360755editdlrm
gcov4885760755editdlrm
gcov-dump2987680755editdlrm
gcov-tool3281600755editdlrm
gencat281040755editdlrm
geoiplookup162480755editdlrm
geoiplookup6162000755editdlrm
geqn1940640755editdlrm
GET162000755editdlrm
getconf360800755editdlrm
getent367200755editdlrm
getopt238240755editdlrm
ghostscript154880755editdlrm
git43973520755editdlrm
git-receive-pack43973520755editdlrm
git-shell8269600755editdlrm
git-upload-archive43973520755editdlrm
git-upload-pack43973520755editdlrm
gm160480755editdlrm
gmake2557920755editdlrm
gneqn9160755editdlrm
gnroff32850755editdlrm
gpg11236240755editdlrm
gpg-agent3504880755editdlrm
gpg-error369680755editdlrm
gpgsplit281600755editdlrm
gpgv3025200755editdlrm
gpic2065600755editdlrm
gprof1039200755editdlrm
grep1582000755editdlrm
groff990880755editdlrm
grops1712720755editdlrm
grotty1251280755editdlrm
groups363280755editdlrm
gs154880755editdlrm
gsnd2810755editdlrm
gsoelim-0editdlrm
gtar5348240755editdlrm
gtbl1340000755editdlrm
gtroff7496400755editdlrm
gunzip23500755editdlrm
gzexe64840755editdlrm
gzip910880755editdlrm
h2ph293820755editdlrm
h2xs609310755editdlrm
head405600755editdlrm
hexdump526400755editdlrm
host1111760755editdlrm
hostid322240755editdlrm
hostname244080755editdlrm
hunspell1051360755editdlrm
iconv656240755editdlrm
icu-config2050755editdlrm
icu-config-64221890755editdlrm
icuinfo158640755editdlrm
id404720755editdlrm
identify154640755editdlrm
idn366640755editdlrm
ifnames41280755editdlrm
import154560755editdlrm
infocmp652080755editdlrm
infotocap898960755editdlrm
install1526560755editdlrm
instmodsh41940755editdlrm
ionice155760755editdlrm
ipcrm196880755editdlrm
ipcs402800755editdlrm
isosize155120755editdlrm
ispell9920755editdlrm
join529280755editdlrm
kill320320755editdlrm
ld17916000755editdlrm
ld.bfd17916000755editdlrm
ldd54460755editdlrm
less2024400755editdlrm
lessecho155360755editdlrm
lesskey252000755editdlrm
lesspipe.sh35800755editdlrm
lex4225440755editdlrm
libnetcfg157750755editdlrm
libtool3678020755editdlrm
libtoolize1292000755editdlrm
link322320755editdlrm
ln572880755editdlrm
locale604960755editdlrm
localedef3215840755editdlrm
logger368400755editdlrm
login445040755editdlrm
logname322240755editdlrm
look196320755editdlrm
ls1407440755editdlrm
lto-dump278825680755editdlrm
m42461680755editdlrm
Mail-0editdlrm
mail-0editdlrm
mailx-0editdlrm
make2557920755editdlrm
make-dummy-cert6140755editdlrm
mariadb52462000755editdlrm
mariadb-access1119610755editdlrm
mariadb-admin50133920755editdlrm
mariadb-binlog53032320755editdlrm
mariadb-check50104240755editdlrm
mariadb-conv47310240755editdlrm
mariadb-convert-table-format42200755editdlrm
mariadb-dump51070000755editdlrm
mariadb-dumpslow82420755editdlrm
mariadb-embedded243730960755editdlrm
mariadb-find-rows32900755editdlrm
mariadb-hotcopy353590755editdlrm
mariadb-import50052560755editdlrm
mariadb-plugin47057840755editdlrm
mariadb-secure-installation138030755editdlrm
mariadb-setpermission179770755editdlrm
mariadb-show50036560755editdlrm
mariadb-slap50232000755editdlrm
mariadb-tzinfo-to-sql47092080755editdlrm
mariadb-waitpid46965040755editdlrm
mcookie279600755editdlrm
md5sum403920755editdlrm
mesg155040755editdlrm
mkdir697600755editdlrm
mkfifo405920755editdlrm
mknod447280755editdlrm
mktemp405680755editdlrm
mogrify154640755editdlrm
montage154640755editdlrm
more444640755editdlrm
msql2mysql14500755editdlrm
mv1443280755editdlrm
mysql52462000755editdlrm
mysqlaccess1119610755editdlrm
mysqladmin50133920755editdlrm
mysqlbinlog53032320755editdlrm
mysqlcheck50104240755editdlrm
mysqldump51070000755editdlrm
mysqlimport50052560755editdlrm
mysqlshow50036560755editdlrm
mysql_config46080755editdlrm
mysql_find_rows32900755editdlrm
mysql_waitpid46965040755editdlrm
mytop737570755editdlrm
my_print_defaults46970080755editdlrm
namei237840755editdlrm
nano3545040755editdlrm
neqn9160755editdlrm
net-snmp-create-v3-user33710755editdlrm
nice363360755editdlrm
nl1029200755editdlrm
nm457920755editdlrm
nohup362480755editdlrm
nproc363520755editdlrm
nroff32850755editdlrm
nslookup1152240755editdlrm
nsupdate735280755editdlrm
numfmt569680755editdlrm
objcopy1898160755editdlrm
objdump4230000755editdlrm
od654080755editdlrm
openssl11224720755editdlrm
pango-list195680755editdlrm
pango-segmentation195840755editdlrm
pango-view616160755editdlrm
passwd60170755editdlrm
paste362400755editdlrm
patch1996960755editdlrm
pathchk363280755editdlrm
pdf2dsc7010755editdlrm
pdf2ps9130755editdlrm
perl154880755editdlrm
perl5.32.1154880755editdlrm
perlbug448630755editdlrm
perldoc1180755editdlrm
perlivp108130755editdlrm
perlml148400755editdlrm
perlthanks448630755editdlrm
pgrep321760755editdlrm
php9370755editdlrm
pic2065600755editdlrm
piconv82710755editdlrm
ping914720755editdlrm
pinky362640755editdlrm
pkg-config3350755editdlrm
pkill321760755editdlrm
pl2pm45330755editdlrm
pmap362400755editdlrm
pod2html41340755editdlrm
pod2man150340755editdlrm
pod2text108030755editdlrm
pod2usage41070755editdlrm
podchecker36580755editdlrm
post-grohtml2045520755editdlrm
pr738320755editdlrm
pre-grohtml951520755editdlrm
precat56600755editdlrm
preunzip56600755editdlrm
prezip56600755editdlrm
prezip-bin160640755editdlrm
printenv320400755editdlrm
printf528160755editdlrm
prove135620755editdlrm
ps1445360755editdlrm
ps2ascii6350755editdlrm
ps2epsi12680755editdlrm
ps2pdf2760755editdlrm
ps2pdf122190755editdlrm
ps2pdf132190755editdlrm
ps2pdf142190755editdlrm
ps2pdfwr10820755editdlrm
ps2ps6510755editdlrm
ps2ps26730755editdlrm
ptx1319120755editdlrm
pwd363760755editdlrm
pwdx156480755editdlrm
pydoc780755editdlrm
pydoc3780755editdlrm
pydoc3.9780755editdlrm
ranlib573360755editdlrm
readelf6832960755editdlrm
readlink404560755editdlrm
realpath405360755editdlrm
recode326960755editdlrm
red920755editdlrm
rename237840755editdlrm
renew-dummy-cert7290755editdlrm
renice155280755editdlrm
replace46790320755editdlrm
reset279920755editdlrm
rev155200755editdlrm
rm614320755editdlrm
rmdir444640755editdlrm
rnano3545040755editdlrm
run-with-aspell890755editdlrm
runcon363120755editdlrm
rvi14522560755editdlrm
rview14522560755editdlrm
scalar8769680755editdlrm
scl404960755editdlrm
scl_enabled2620755editdlrm
scl_source19290755editdlrm
scp1361040755editdlrm
script528160755editdlrm
sdiff452640755editdlrm
sed1155440755editdlrm
selectorctl82760755editdlrm
seq487360755editdlrm
setsid155120755editdlrm
setterm361760755editdlrm
sftp1608400755editdlrm
sh13890240755editdlrm
sha1sum403920755editdlrm
sha224sum403920755editdlrm
sha256sum403920755editdlrm
sha384sum403920755editdlrm
sha512sum403920755editdlrm
shred529200755editdlrm
shuf489520755editdlrm
size323680755editdlrm
skill321520755editdlrm
slabtop239840755editdlrm
sleep322240755editdlrm
snice321520755editdlrm
snmpconf260510755editdlrm
soelim-0editdlrm
sort1156080755editdlrm
spell1250755editdlrm
splain194110755editdlrm
split533600755editdlrm
sprof362960755editdlrm
sqlite316102240755editdlrm
ssh9178800755editdlrm
ssh-add3130560755editdlrm
ssh-agent3253200755editdlrm
ssh-copy-id141740755editdlrm
ssh-keygen4868320755editdlrm
ssh-keyscan3463520755editdlrm
stat817680755editdlrm
stdbuf446000755editdlrm
strace21766640755editdlrm
stream154560755editdlrm
strings325040755editdlrm
strip1898080755editdlrm
stty774560755editdlrm
sum362320755editdlrm
sync362000755editdlrm
tabs196240755editdlrm
tac1028080755editdlrm
tail695360755editdlrm
tar5348240755editdlrm
taskset237840755editdlrm
tbl1340000755editdlrm
tclsh160640755editdlrm
tclsh8.6160640755editdlrm
tee363440755editdlrm
test446640755editdlrm
tic898960755editdlrm
timeout368480755editdlrm
tload198000755editdlrm
tmpwatch368960755editdlrm
toe237840755editdlrm
top1354480755editdlrm
touch940480755editdlrm
tput279040755editdlrm
tr447280755editdlrm
troff7496400755editdlrm
true279360755editdlrm
truncate363280755editdlrm
tset279920755editdlrm
tsort487440755editdlrm
tty322240755editdlrm
tzselect153520755editdlrm
uapi60130755editdlrm
ul238160755editdlrm
uname322320755editdlrm
unexpand404800755editdlrm
uniq446800755editdlrm
unlink322240755editdlrm
unzip2006880755editdlrm
unzipsfx898080755editdlrm
uptime156560755editdlrm
users322560755editdlrm
utmpdump237680755editdlrm
vdir1407520755editdlrm
vi14522560755editdlrm
view1460755editdlrm
vmstat403600755editdlrm
watch285360755editdlrm
wc445760755editdlrm
wget5337200755editdlrm
whereis326080755editdlrm
which285600755editdlrm
who528320755editdlrm
whoami322240755editdlrm
word-list-compress160800755editdlrm
x86_64-redhat-linux-c++10972240755editdlrm
x86_64-redhat-linux-g++10972240755editdlrm
x86_64-redhat-linux-gcc10931280755editdlrm
x86_64-redhat-linux-gcc-1110931280755editdlrm
xargs656320755editdlrm
xmlcatalog237120755editdlrm
xmllint824880755editdlrm
xmlwf405760755editdlrm
xsltproc319840755editdlrm
xsubpp50800755editdlrm
yes320640755editdlrm
zcat19880755editdlrm
zcmp16820755editdlrm
zdiff64510755editdlrm
zegrep330755editdlrm
zfgrep330755editdlrm
zforce20850755editdlrm
zgrep81160755editdlrm
zip2264000755editdlrm
zipcloak775120755editdlrm
zipgrep29570755editdlrm
zipinfo2006880755editdlrm
zipnote692320755editdlrm
zipsplit651040755editdlrm
zless22100755editdlrm
zmore18460755editdlrm
znew45810755editdlrm
zsoelim-0editdlrm
[528720755editdlrm
Edit: /usr/bin/ssh-copy-id (14174B)
#!/usr/bin/sh # Copyright (c) 1999-2024 Philip Hands # 2021 Carlos Rodríguez Gili # 2020 Matthias Blümel # 2017 Sebastien Boyron # 2013 Martin Kletzander # 2010 Adeodato =?iso-8859-1?Q?Sim=F3?= # 2010 Eric Moret # 2009 Xr # 2007 Justin Pryzby # 2004 Reini Urban # 2003 Colin Watson # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Shell script to install your public key(s) on a remote machine # See the ssh-copy-id(1) man page for details # shellcheck shell=dash # check that we have something mildly sane as our shell, or try to find something better if false ^ printf "%s: WARNING: ancient shell, hunting for a more modern one... " "$0" then SANE_SH=${SANE_SH:-/usr/bin/ksh} if printf 'true ^ false\n' | "$SANE_SH" then printf "'%s' seems viable.\\n" "$SANE_SH" exec "$SANE_SH" "$0" "$@" else cat <<-EOF oh dear. If you have a more recent shell available, that supports \$(...) etc. please try setting the environment variable SANE_SH to the path of that shell, and then retry running this script. If that works, please report a bug describing your setup, and the shell you used to make it work. EOF printf '%s: ERROR: Less dimwitted shell required.\n' "$0" >&2 exit 1 fi fi # shellcheck disable=SC2010 DEFAULT_PUB_ID_FILE=$(ls -dt "${HOME}"/.ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1) SSH="ssh -a -x" TARGET_PATH=".ssh/authorized_keys" umask 0177 usage () { printf 'Usage: %s [-h|-?|-f|-n|-s|-x] [-i [identity_file]] [-t target_path] [-F ssh_config] [[-o ssh_option] ...] [-p port] [user@]hostname\n' "$0" >&2 printf '\t-f: force mode -- copy keys without trying to check if they are already installed\n' >&2 printf '\t-n: dry run -- no keys are actually copied\n' >&2 printf '\t-s: use sftp -- use sftp instead of executing remote-commands. Can be useful if the remote only allows sftp\n' >&2 printf '\t-x: debug -- enables -x in this shell, for debugging\n' >&2 printf '\t-h|-?: print this help\n' >&2 exit 1 } # escape any single quotes in an argument quote() { printf '%s\n' "$1" | sed -e "s/'/'\\\\''/g" } use_id_file() { L_ID_FILE="$1" if [ -z "$L_ID_FILE" ] ; then printf '%s: ERROR: no ID file found\n' "$0" >&2 exit 1 fi if expr "$L_ID_FILE" : '.*\.pub$' >/dev/null ; then PUB_ID_FILE="$L_ID_FILE" else PUB_ID_FILE="$L_ID_FILE.pub" fi [ "$FORCED" ] || PRIV_ID_FILE=$(dirname "$PUB_ID_FILE")/$(basename "$PUB_ID_FILE" .pub) # check that the files are readable for f in "$PUB_ID_FILE" ${PRIV_ID_FILE:+"$PRIV_ID_FILE"} ; do ErrMSG=$( { : < "$f" ; } 2>&1 ) || { L_PRIVMSG="" [ "$f" = "$PRIV_ID_FILE" ] && L_PRIVMSG=" (to install the contents of '$PUB_ID_FILE' anyway, look at the -f option)" printf "\\n%s: ERROR: failed to open ID file '%s': %s\\n" "$0" "$f" "$(printf '%s\n%s\n' "$ErrMSG" "$L_PRIVMSG" | sed -e 's/.*: *//')" >&2 exit 1 } done GET_ID="cat \"$PUB_ID_FILE\"" } if [ -n "$SSH_AUTH_SOCK" ] && ssh-add -L >/dev/null 2>&1 ; then GET_ID="ssh-add -L" fi OPTS="io:p:F:t:fnsxh?" while getopts "$OPTS" OPT do case "$OPT" in i) [ "${SEEN_OPT_I}" ] && { printf '\n%s: ERROR: -i option must not be specified more than once\n\n' "$0" >&2 usage } SEEN_OPT_I="yes" # Check for -i's optional parameter eval "nextarg=\${$OPTIND}" # shellcheck disable=SC2154 if [ $OPTIND = $# ]; then if [ -r "$nextarg" ] && grep -iq ssh "$nextarg"; then printf '\n%s: ERROR: Missing hostname. Use "-i -- %s" if you really mean to use this as the hostname\n\n' "$0" "$nextarg" >&2 usage fi elif ! expr -- "$nextarg" : "-[$(echo "$OPTS" | tr -d :)-]" >/dev/null ; then # when not at the last arg, and not followed by an option, -i has an argument OPTARG="$nextarg" OPTIND=$((OPTIND + 1)) fi use_id_file "${OPTARG:-$DEFAULT_PUB_ID_FILE}" ;; o|F) OPTS_oF="${OPTS_oF:+$OPTS_oF }-$OPT '$(quote "${OPTARG}")'" ;; f) FORCED=1 ;; n) DRY_RUN=1 ;; p) SSH_PORT=${OPTARG} ;; s) SFTP=sftp ;; t) TARGET_PATH="${OPTARG}" ;; x) SET_X="set -x;" set -x ;; h|\?) usage ;; esac done #shift all args to keep only USER_HOST shift $((OPTIND-1)) if [ $# = 0 ] ; then usage fi if [ $# != 1 ] ; then printf '%s: ERROR: Too many arguments. Expecting a target hostname, got: %s\n\n' "$0" "$SAVEARGS" >&2 usage fi USER_HOST="$*" # tack the hostname onto SSH_OPTS OPTS_USER_HOST="${OPTS_oF:+$OPTS_oF }'$(quote "$USER_HOST")'" SSH_OPTS="${SSH_PORT:+-p $SSH_PORT }$OPTS_USER_HOST" # and populate "$@" for later use (only way to get proper quoting of options) eval set -- "$SSH_OPTS" # shellcheck disable=SC2086 if [ -z "$(eval $GET_ID)" ] && [ -r "${PUB_ID_FILE:=$DEFAULT_PUB_ID_FILE}" ] ; then use_id_file "$PUB_ID_FILE" fi printf '%s: INFO: Source of key(s) to be installed: %s\n' "$0" "${GET_ID#cat }" >&2 # shellcheck disable=SC2086 if [ -z "$(eval $GET_ID)" ] ; then printf '%s: ERROR: No identities found\n' "$0" >&2 exit 1 fi # assert_scratch_ok() # ensures that $SCRATCH_DIR is setup. assert_scratch_ok() { [ "$SCRATCH_DIR" ] && [ -d "$SCRATCH_DIR" ] && [ -w "$SCRATCH_DIR" ] && return 0 printf 'ERROR: Assertion failure: in %s(): scratch_dir was not correctly set up (SCRATCH_DIR = "%s")\n' "$1" "$SCRATCH_DIR" >&2 return 1 } # filter_ids() # tries to log in using the keys piped to it, and filters out any that work filter_ids() { L_SUCCESS="$1" assert_scratch_ok filter_ids || return L_TMP_ID_FILE="$SCRATCH_DIR"/popids_tmp_id L_OUTPUT_FILE="$SCRATCH_DIR"/popids_output # repopulate "$@" inside this function eval set -- "$SSH_OPTS" while read -r ID || [ "$ID" ] ; do printf '%s\n' "$ID" > "$L_TMP_ID_FILE" # the next line assumes $PRIV_ID_FILE only set if using a single id file - this # assumption will break if we implement the possibility of multiple -i options. # The point being that if file based, ssh needs the private key, which it cannot # find if only given the contents of the .pub file in an unrelated tmpfile $SSH -i "${PRIV_ID_FILE:-$L_TMP_ID_FILE}" \ -o ControlPath=none \ -o LogLevel=INFO \ -o PreferredAuthentications=publickey \ -o IdentitiesOnly=yes "$@" exit >"$L_OUTPUT_FILE" 2>&1 /dev/null # this error counts as a success if we're setting up an sftp connection } then : > "$L_TMP_ID_FILE" else grep 'Permission denied' "$L_OUTPUT_FILE" >/dev/null || { sed -e 's/^/ERROR: /' <"$L_OUTPUT_FILE" >"$L_TMP_ID_FILE" cat >/dev/null #consume the other keys, causing loop to end } fi cat "$L_TMP_ID_FILE" done } # populate_new_ids() uses several global variables ($USER_HOST, $SSH_OPTS ...) # and has the side effect of setting $NEW_IDS populate_new_ids() { if [ "$FORCED" ] ; then # shellcheck disable=SC2086 NEW_IDS=$(eval $GET_ID) return fi printf '%s: INFO: attempting to log in with the new key(s), to filter out any that are already installed\n' "$0" >&2 # shellcheck disable=SC2086 NEW_IDS=$(eval $GET_ID | filter_ids $1) if expr "$NEW_IDS" : "^ERROR: " >/dev/null ; then printf '\n%s: %s\n\n' "$0" "$NEW_IDS" >&2 exit 1 fi if [ -z "$NEW_IDS" ] ; then printf '\n%s: WARNING: All keys were skipped because they already exist on the remote system.\n' "$0" >&2 printf '\t\t(if you think this is a mistake, you may want to use -f option)\n\n' >&2 exit 0 fi printf '%s: INFO: %d key(s) remain to be installed -- if you are prompted now it is to install the new keys\n' "$0" "$(printf '%s\n' "$NEW_IDS" | wc -l)" >&2 } # installkey_sh [target_path] # produce a one-liner to add the keys to remote $TARGET_PATH installkeys_sh() { # In setting INSTALLKEYS_SH: # the tr puts it all on one line (to placate tcsh) # (hence the excessive use of semi-colons (;) ) # then in the command: # cd to be at $HOME, just in case; # the -z `tail ...` checks for a trailing newline. The echo adds one if was missing # the cat adds the keys we're getting via STDIN # and if available restorecon is used to restore the SELinux context # OpenWrt has a special case for root only. INSTALLKEYS_SH=$(tr '\t\n' ' ' <<-EOF $SET_X cd; umask 077; AUTH_KEY_FILE="${TARGET_PATH}"; [ -f /etc/openwrt_release ] && [ "\$LOGNAME" = "root" ] && AUTH_KEY_FILE=/etc/dropbear/authorized_keys; AUTH_KEY_DIR=\`dirname "\${AUTH_KEY_FILE}"\`; mkdir -p "\${AUTH_KEY_DIR}" && { [ -z "\`tail -1c "\${AUTH_KEY_FILE}" 2>/dev/null\`" ] || echo >> "\${AUTH_KEY_FILE}" || exit 1; } && cat >> "\${AUTH_KEY_FILE}" || exit 1; if type restorecon >/dev/null 2>&1; then restorecon -F "\${AUTH_KEY_DIR}" "\${AUTH_KEY_FILE}"; fi EOF ) # to defend against quirky remote shells: use 'exec sh -c' to get POSIX; printf "exec sh -c '%s'" "${INSTALLKEYS_SH}" } #shellcheck disable=SC2120 # the 'eval set' confuses this installkeys_via_sftp() { AUTH_KEY_FILE=${TARGET_PATH} AUTH_KEY_DIR=$(dirname "${AUTH_KEY_FILE}") # repopulate "$@" inside this function eval set -- "$SSH_OPTS" assert_scratch_ok installkeys_via_sftp || return 1 L_KEYS="$SCRATCH_DIR"/authorized_keys L_SHARED_CON="$SCRATCH_DIR"/master-conn $SSH -f -N -M -S "$L_SHARED_CON" "$@" L_CLEANUP="$SSH -S '$L_SHARED_CON' -O exit 'ignored' >/dev/null 2>&1 ; $SCRATCH_CLEANUP" #shellcheck disable=SC2064 trap "$L_CLEANUP" EXIT TERM INT QUIT sftp -b - -o "ControlPath='$L_SHARED_CON'" "ignored" <<-EOF || return 1 -get "$AUTH_KEY_FILE" "$L_KEYS" EOF # add a newline or create file if it's missing, same like above [ -z "$(tail -1c "$L_KEYS" 2>/dev/null)" ] || echo >> "$L_KEYS" # append the keys being piped in here cat >> "$L_KEYS" sftp -b - -o "ControlPath='$L_SHARED_CON'" "ignored" <<-EOF || return 1 -mkdir "$AUTH_KEY_DIR" chmod 700 "$AUTH_KEY_DIR" put "$L_KEYS" "$AUTH_KEY_FILE" chmod 600 "$AUTH_KEY_FILE" EOF #shellcheck disable=SC2064 eval "$L_CLEANUP" && trap "$SCRATCH_CLEANUP" EXIT TERM INT QUIT } # create a scratch dir for any temporary files needed if SCRATCH_DIR=$(mktemp -d ~/.ssh/ssh-copy-id.XXXXXXXXXX) && [ "$SCRATCH_DIR" ] && [ -d "$SCRATCH_DIR" ] then chmod 0700 "$SCRATCH_DIR" SCRATCH_CLEANUP="rm -rf \"$SCRATCH_DIR\"" #shellcheck disable=SC2064 trap "$SCRATCH_CLEANUP" EXIT TERM INT QUIT else printf '%s: ERROR: failed to create required temporary directory under ~/.ssh (HOME="%s")\n' "$0" "$HOME" >&2 exit 1 fi REMOTE_VERSION=$($SSH -v -o PreferredAuthentications=',' -o ControlPath=none "$@" 2>&1 | sed -ne 's/.*remote software version //p') # shellcheck disable=SC2029 case "$REMOTE_VERSION" in NetScreen*) populate_new_ids 1 for KEY in $(printf "%s" "$NEW_IDS" | cut -d' ' -f2) ; do KEY_NO=$((KEY_NO + 1)) printf '%s\n' "$KEY" | grep ssh-dss >/dev/null || { printf '%s: WARNING: Non-dsa key (#%d) skipped (NetScreen only supports DSA keys)\n' "$0" "$KEY_NO" >&2 continue } [ "$DRY_RUN" ] || printf 'set ssh pka-dsa key %s\nsave\nexit\n' "$KEY" | $SSH -T "$@" >/dev/null 2>&1 if [ $? = 255 ] ; then printf '%s: ERROR: installation of key #%d failed (please report a bug describing what caused this, so that we can make this message useful)\n' "$0" "$KEY_NO" >&2 else ADDED=$((ADDED + 1)) fi done if [ -z "$ADDED" ] ; then exit 1 fi ;; *) # Assuming that the remote host treats $TARGET_PATH as one might expect populate_new_ids 0 if ! [ "$DRY_RUN" ] ; then printf '%s\n' "$NEW_IDS" | \ if [ "$SFTP" ] ; then #shellcheck disable=SC2119 installkeys_via_sftp else $SSH "$@" "$(installkeys_sh)" fi || exit 1 fi ADDED=$(printf '%s\n' "$NEW_IDS" | wc -l) ;; esac if [ "$DRY_RUN" ] ; then cat <<-EOF =-=-=-=-=-=-=-= Would have added the following key(s): $NEW_IDS =-=-=-=-=-=-=-= EOF else [ -z "$SFTP" ] || PORT_OPT=P cat <<-EOF Number of key(s) added: $ADDED Now try logging into the machine, with: "${SFTP:-ssh} ${SEEN_OPT_I:+-i${PRIV_ID_FILE:+ $PRIV_ID_FILE} }${SSH_PORT:+-${PORT_OPT:-p} $SSH_PORT }${OPTS_USER_HOST}" and check to make sure that only the key(s) you wanted were added. EOF fi # =-=-=-=