mirror of
https://github.com/webinstall/webi-installers.git
synced 2026-08-19 03:56:16 +00:00
refactor(setcap-netbind): update bash to style, update docs
This commit is contained in:
@@ -1,23 +1,64 @@
|
||||
---
|
||||
title: setcap-netbind
|
||||
homepage: https://github.com/webinstall/webi-installers/setcap-netbind/README.md
|
||||
homepage: https://github.com/webinstall/webi-installers/setcap-netbind/
|
||||
tagline: |
|
||||
setcap-netbind: Give a binary the ability to bind to privileged ports.
|
||||
---
|
||||
|
||||
setcap-netbind will grant the specified program the ability to listen on
|
||||
privileged ports, such as 80 (http) and 443 (https) without root privileges or
|
||||
sudo. It seeks out the specified binary in your path and reads down symlinks to
|
||||
make usage as painless as possible.
|
||||
|
||||
## Cheat Sheet
|
||||
|
||||
> Because no one can ever remember `setcap 'cap_net_bind_service=+ep'`.
|
||||
> Everybody has to look it up. Every. Time.
|
||||
>
|
||||
> Well... not anymore.
|
||||
>
|
||||
> `setcap-netbind` does that ^^, plus it follows links - which is nice.
|
||||
|
||||
Gives a command permission to run on privileged ports (80, 443, etc).
|
||||
|
||||
```txt
|
||||
Usage:
|
||||
sudo setcap-netbind <COMMAND>
|
||||
|
||||
Example:
|
||||
sudo setcap-netbind node
|
||||
```
|
||||
|
||||
`setcap-netbind` will grant the specified program the ability to listen on
|
||||
privileged ports, such as 80 (http) and 443 (https) without root privileges or
|
||||
`sudo`. It seeks out the specified binary in your path and reads down symlinks
|
||||
to make usage as painless as possible.
|
||||
|
||||
**_Note_**: Capability binding is specific to a particular binary file. You'll
|
||||
need to rerun `setcap-netbind <COMMAND>` each time you upgrade or reinstall a
|
||||
command.
|
||||
|
||||
# How to use plain setcap
|
||||
|
||||
These two commands are equivalent:
|
||||
|
||||
```bash
|
||||
sudo setcap-netbind node
|
||||
```
|
||||
|
||||
This is the same as running the full command:
|
||||
|
||||
```bash
|
||||
sudo setcap 'cap_net_bind_service=+ep' $(readlink -f $(which node))
|
||||
sudo setcap 'cap_net_bind_service=+ep' "$(readlink -f "$(command -v node)")"
|
||||
```
|
||||
|
||||
The benefit of `setcap-netbind` is simply that it's easier to remember (and will
|
||||
auto-complete with tab), and it will follow symbolic links. \
|
||||
(`setcap` will not work on symlinks - probably as a security measure)
|
||||
|
||||
<!--
|
||||
|
||||
# Security
|
||||
|
||||
This is intended for use on single-user Desktops, single-user VPS systems,
|
||||
ephemeral cloud instances, etc.
|
||||
|
||||
(note to self: not sure how to say this because it won't matter to most people
|
||||
and could sound scary - yet their alternative solution is probably much worse,
|
||||
so... probably best to let them use this and be _more_ secure than scare them
|
||||
with the nuance details - if you know, you know... y'know?)
|
||||
|
||||
-->
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -u
|
||||
|
||||
{
|
||||
set -e
|
||||
set -u
|
||||
function __install_setcap_netbind() {
|
||||
# remove prior version, if exists
|
||||
rm -f ~/.local/bin/setcap-netbind
|
||||
|
||||
rm -f "$HOME/.local/bin/setcap-netbind"
|
||||
webi_download "$WEBI_HOST/packages/setcap-netbind/setcap-netbind.sh" "$HOME/.local/bin/setcap-netbind"
|
||||
chmod a+x "$HOME/.local/bin/setcap-netbind"
|
||||
# download latest version, directly to ~/.local/bin
|
||||
webi_download \
|
||||
"$WEBI_HOST/packages/setcap-netbind/setcap-netbind.sh" \
|
||||
~/.local/bin/setcap-netbind
|
||||
|
||||
# make executable
|
||||
chmod a+x ~/.local/bin/setcap-netbind
|
||||
}
|
||||
|
||||
__install_setcap_netbind
|
||||
|
||||
@@ -1,17 +1,26 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -u
|
||||
|
||||
{
|
||||
set -e
|
||||
set -u
|
||||
my_bin="${1}"
|
||||
# ex: node
|
||||
if [ -z "$(command -v "${my_bin}")" ]; then
|
||||
echo "setcap-netbind: '${my_bin}' not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
my_bin="$1"
|
||||
if [ -z "$(which $my_bin)" ]; then
|
||||
echo "'$my_bin' not found"
|
||||
exit 1
|
||||
fi
|
||||
my_sudo=""
|
||||
if [ -n "$(command -v sudo)" ]; then
|
||||
my_sudo=sudo
|
||||
fi
|
||||
$my_sudo setcap 'cap_net_bind_service=+ep' $(readlink -f $(which $my_bin))
|
||||
}
|
||||
my_sudo=""
|
||||
if [ -n "$(command -v sudo)" ]; then
|
||||
my_sudo=sudo
|
||||
fi
|
||||
|
||||
# get full path
|
||||
# ex: ~/.local/opt/node/bin/node
|
||||
my_bin="$(command -v "${my_bin}")"
|
||||
|
||||
# get canonical full path
|
||||
# ex: ~/.local/opt/node-v16.13.0/bin/node
|
||||
my_bin="$(readlink -f "${my_bin}")"
|
||||
|
||||
# ex: sudo setcap 'cap_net_bind_service=+ep' ~/.local/opt/node-v16.13.0/bin/node"
|
||||
"${my_sudo}" setcap 'cap_net_bind_service=+ep' "${my_bin}"
|
||||
|
||||
Reference in New Issue
Block a user