本文主要是介绍在服务器上浏览图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
@StarSky 2018-10-26 15:09 字数 15971 阅读 28
https://www.zybuluo.com/StarSky/note/1294871 来源
2018-09-27 线上服务器安装 imgcat
Tool
- 2018-09-27 线上服务器安装 imgcat
-
- 0. 准备文件:iterm2_shell_integration.bash
- 1. 在有权限的文件夹下新建文件 install_shell_integration_and_utilities.sh
- 2. 新建文件 ~/.iterm2/imgcat
- 3. 新建文件~/.iterm2/it2dl
- 4. 新建 ~/.iterm2/imgls
- 5. 执行 install_shell_integration_and_utilities.sh
- 6. 退出 session ,并重新登陆
-
iterm2 的新特性支持 img display, 该特性可以在线看图,无需将图片下载到本地
因为线上服务器不能链接到外网,整理安装步骤如下。
?:能链外网的情况下直接 bash install_shell_integration_and_utilities.sh
0. 准备文件:iterm2_shell_integration.bash
vim iterm2_shell_integration.bash
#!/bin/bash# This is based on "preexec.bash" but is customized for iTerm2.# Note: this module requires 2 bash features which you must not otherwise be# using: the "DEBUG" trap, and the "PROMPT_COMMAND" variable. iterm2_preexec_install# will override these and if you override one or the other this _will_ break.# This is known to support bash3, as well as *mostly* support bash2.05b. It# has been tested with the default shells on macOS 10.4 "Tiger", Ubuntu 5.10# "Breezy Badger", Ubuntu 6.06 "Dapper Drake", and Ubuntu 6.10 "Edgy Eft".# tmux and screen are not supported; even using the tmux hack to get escape# codes passed through, ncurses interferes and the cursor isn't in the right# place at the time it's passed through.if [[ "$TERM" != screen && "$ITERM_SHELL_INTEGRATION_INSTALLED" = "" && "$-" == *i* ]]; thenITERM_SHELL_INTEGRATION_INSTALLED=Yes# Saved copy of your PS1. This is used to detect if the user changes PS1# directly. ITERM_PREV_PS1 will hold the last value that this script set PS1 to# (including various custom escape sequences).ITERM_PREV_PS1="$PS1"# This variable describes whether we are currently in "interactive mode";# i.e. whether this shell has just executed a prompt and is waiting for user# input. It documents whether the current command invoked by the trace hook is# run interactively by the user; it's set immediately after the prompt hook,# and unset as soon as the trace hook is run.ITERM_PREEXEC_INTERACTIVE_MODE=""# Default do-nothing implementation of preexec.function preexec () {true}# Default do-nothing implementation of precmd.function precmd () {true}# This function is installed as the PROMPT_COMMAND; it is invoked before each# interactive prompt display. It sets a variable to indicate that the prompt# was just displayed, to allow the DEBUG trap, below, to know that the next# command is likely interactive.function iterm2_preexec_invoke_cmd () {# Ideally we could do this in iterm2_preexec_install but CentOS 7.2 and# RHEL 7.2 complain about bashdb-main.inc not existing if you do that# (issue 4160).# *BOTH* of these options need to be set for the DEBUG trap to be invoked# in ( ) subshells. This smells like a bug in bash to me. The null stackederr# redirections are to quiet errors on bash2.05 (i.e. OSX's default shell)# where the options can't be set, and it's impossible to inherit the trap# into subshells.set -o functrace > /dev/null 2>&1shopt -s extdebug > /dev/null 2>&1\local s=$?last_hist_ent="$(HISTTIMEFORMAT= builtin history 1)";precmd;# This is an iTerm2 addition to try to work around a problem in the# original preexec.bash.# When the PS1 has command substitutions, this gets invoked for each# substitution and each command that's run within the substitution, which# really adds up. It would be great if we could do something like this at# the end of this script:# PS1="$(iterm2_prompt_prefix)$PS1($iterm2_prompt_suffix)"# and have iterm2_prompt_prefix set a global variable that tells precmd not to# output anything and have iterm2_prompt_suffix reset that variable.# Unfortunately, command substitutions run in subshells and can't# communicate to the outside world.# Instead, we have this workaround. We save the original value of PS1 in# $ITERM_ORIG_PS1. Then each time this function is run (it's called from# PROMPT_COMMAND just before the prompt is shown) it will change PS1 to a# string without any command substitutions by doing eval on ITERM_ORIG_PS1. At# this point ITERM_PREEXEC_INTERACTIVE_MODE is still the empty string, so preexec# won't produce output for command substitutions.# The first time this is called ITERM_ORIG_PS1 is unset. This tests if the variable# is undefined (not just empty) and initializes it. We can't initialize this at the# top of the script because it breaks with liquidprompt. liquidprompt wants to# set PS1 from a PROMPT_COMMAND that runs just before us. Setting ITERM_ORIG_PS1# at the top of the script will overwrite liquidprompt's PS1, whose value would# never make it into ITERM_ORIG_PS1. Issue 4532. It's important to check# if it's undefined before checking if it's empty because some users have# bash set to error out on referencing an undefined variable.if [ -z "${ITERM_ORIG_PS1+xxx}" ]then# ITERM_ORIG_PS1 always holds the last user-set value of PS1.# You only get here on the first time iterm2_preexec_invoke_cmd is called.export ITERM_ORIG_PS1="$PS1"fiif [[ "$PS1" != "$ITERM_PREV_PS1" ]]thenexport ITERM_ORIG_PS1="$PS1"fi# Get the value of the prompt prefix, which will change $?\local iterm2_prompt_prefix_value="$(iterm2_prompt_prefix)"# Add the mark unless the prompt includes '$(iterm2_prompt_mark)' as a substring.if [[ $ITERM_ORIG_PS1 != *'$(iterm2_prompt_mark)'* ]]theniterm2_prompt_prefix_value="$iterm2_prompt_prefix_value$(iterm2_prompt_mark)"fi# Send escape sequences with current directory and hostname.iterm2_print_state_data# Reset $? to its saved value, which might be used in $ITERM_ORIG_PS1.sh -c "exit $s"# Set PS1 to various escape sequences, the user's preferred prompt, and more escape sequences.export PS1="\[$iterm2_prompt_prefix_value\]$ITERM_ORIG_PS1\[$(iterm2_prompt_suffix)\]"# Save the value we just set PS1 to so if the user changes PS1 we'll know and we can update ITERM_ORIG_PS1.export ITERM_PREV_PS1="$PS1"sh -c "exit $s"# This must be the last line in this function, or else# iterm2_preexec_invoke_exec will do its thing at the wrong time.ITERM_PREEXEC_INTERACTIVE_MODE="yes";}# This function is installed as the DEBUG trap. It is invoked before each# interactive prompt display. Its purpose is to inspect the current# environment to attempt to detect if the current command is being invoked# interactively, and invoke 'preexec' if so.function iterm2_preexec_invoke_exec () {if [ ! -t 1 ]then# We're in a piped subshell (STDOUT is not a TTY) like# (echo -n A; sleep 1; echo -n B) | wc -c# ...which should return "2".returnfiif [[ -n "${COMP_LINE:-}" ]]then# We're in the middle of a completer. This obviously can't be# an interactively issued command.returnfiif [[ -z "$ITERM_PREEXEC_INTERACTIVE_MODE" ]]then# We're doing something related to displaying the prompt. Let the# prompt set the title instead of me.returnelse# If we're in a subshell, then the prompt won't be re-displayed to put# us back into interactive mode, so let's not set the variable back.# In other words, if you have a subshell like# (sleep 1; sleep 2)# You want to see the 'sleep 2' as a set_command_title as well.if [[ 0 -eq "$BASH_SUBSHELL" ]]thenITERM_PREEXEC_INTERACTIVE_MODE=""fifiif [[ "iterm2_preexec_invoke_cmd" == "$BASH_COMMAND" ]]then# Sadly, there's no cleaner way to detect two prompts being displayed# one after another. This makes it important that PROMPT_COMMAND# remain set _exactly_ as below in iterm2_preexec_install. Let's switch back# out of interactive mode and not trace any of the commands run in# precmd.# Given their buggy interaction between BASH_COMMAND and debug traps,# versions of bash prior to 3.1 can't detect this at all.ITERM_PREEXEC_INTERACTIVE_MODE=""returnfi# In more recent versions of bash, this could be set via the "BASH_COMMAND"# variable, but using history here is better in some ways: for example, "ps# auxf | less" will show up with both sides of the pipe if we use history,# but only as "ps auxf" if not.hist_ent="$(HISTTIMEFORMAT= builtin history 1)";\local prev_hist_ent="${last_hist_ent}";last_hist_ent="${hist_ent}";if [[ "${prev_hist_ent}" != "${hist_ent}" ]]; then\local this_command="$(echo "${hist_ent}" | sed -e "s/^[ ]*[0-9]*[ ]*//g")";else\local this_command="";fi;# If none of the previous checks have earlied out of this function, then# the command is in fact interactive and we should invoke the user's# preexec hook with the running command as an argument.preexec "$this_command";}# Execute this to set up preexec and precmd execution.function iterm2_preexec_install () {# Finally, install the actual traps.if ( [ x"${PROMPT_COMMAND:-}" = x ]); thenPROMPT_COMMAND="iterm2_preexec_invoke_cmd";else# If there's a trailing semicolon folowed by spaces, remove it (issue 3358).PROMPT_COMMAND="$(echo -n $PROMPT_COMMAND | sed -e 's/; *$//'); iterm2_preexec_invoke_cmd";fi# The $_ is ignored, but prevents it from changing (issue 3932).trap 'iterm2_preexec_invoke_exec "$_"' DEBUG;}# -- begin iTerm2 customizationfunction iterm2_begin_osc {printf "\033]"}function iterm2_end_osc {printf "\007"}# Runs after interactively edited command but before executionfunction preexec() {iterm2_begin_oscprintf "133;C;"iterm2_end_osc# If PS1 still has the value we set it to in iterm2_preexec_invoke_cmd then# restore it to its original value. It might have changed if you have# another PROMPT_COMMAND (like liquidprompt) that modifies PS1.if [ -n "${ITERM_ORIG_PS1+xxx}" -a "$PS1" = "$ITERM_PREV_PS1" ]thenexport PS1="$ITERM_ORIG_PS1"fiiterm2_ran_preexec="yes"}function precmd () {# Work around a bug in CentOS 7.2 where preexec doesn't run if you press# ^C while entering a command.if [[ -z "${iterm2_ran_preexec:-}" ]]thenpreexec ""fiiterm2_ran_preexec=""}function iterm2_print_state_data() {iterm2_begin_oscprintf "1337;RemoteHost=%s@%s" "$USER" "$iterm2_hostname"iterm2_end_osciterm2_begin_oscprintf "1337;CurrentDir=%s" "$PWD"iterm2_end_osciterm2_print_user_vars}# Usage: iterm2_set_user_var key valuefunction iterm2_set_user_var() {iterm2_begin_oscprintf "1337;SetUserVar=%s=%s" "$1" $(printf "%s" "$2" | base64 | tr -d '\n')iterm2_end_osc}if [ -z "$(type -t iterm2_print_user_vars)" ] || [ "$(type -t iterm2_print_user_vars)" != function ]; then# iterm2_print_user_vars is not already defined. Provide a no-op default version.## Users can write their own version of this function. It should call# iterm2_set_user_var but not produce any other output.function iterm2_print_user_vars() {true}fifunction iterm2_prompt_prefix() {iterm2_begin_oscprintf "133;D;\$?"iterm2_end_osc}function iterm2_prompt_mark() {iterm2_begin_oscprintf "133;A"iterm2_end_osc}function iterm2_prompt_suffix() {iterm2_begin_oscprintf "133;B"iterm2_end_osc}function iterm2_print_version_number() {iterm2_begin_oscprintf "1337;ShellIntegrationVersion=5;shell=bash"iterm2_end_osc}# If hostname -f is slow on your system, set iterm2_hostname before sourcing this script.if [ -z "${iterm2_hostname:-}" ]; theniterm2_hostname=$(hostname -f 2>/dev/null)# some flavors of BSD (i.e. NetBSD and OpenBSD) don't have the -f optionif [ $? -ne 0 ]; theniterm2_hostname=$(hostname)fifiiterm2_preexec_install# This is necessary so the first command line will have a hostname and current directory.iterm2_print_state_dataiterm2_print_version_numberfi
1. 在有权限的文件夹下新建文件 install_shell_integration_and_utilities.sh
vim install_shell_integration_and_utilities.sh
#!/bin/bashfunction die() {echo "${1}"exit 1}which printf > /dev/null 2>&1 || die "Shell integration requires the printf binary to be in your path."SHELL=${SHELL##*/}URL=""HOME_PREFIX='${HOME}'SHELL_AND='&&'QUOTE=''if [ "${SHELL}" = tcsh ]thenURL="https://iterm2.com/misc/tcsh_startup.in"SCRIPT="${HOME}/.login"QUOTE='"'ALIASES='alias imgcat ~/.iterm2/imgcat; alias it2dl ~/.iterm2/it2dl'fiif [ "${SHELL}" = zsh ]thenURL="https://iterm2.com/misc/zsh_startup.in"SCRIPT="${HOME}/.zshrc"QUOTE='"'ALIASES='alias imgcat=~/.iterm2/imgcat; alias it2dl=~/.iterm2/it2dl'fiif [ "${SHELL}" = bash ]thenURL="https://iterm2.com/misc/bash_startup.in"test -f "${HOME}/.bash_profile" && SCRIPT="${HOME}/.bash_profile" || SCRIPT="${HOME}/.profile"QUOTE='"'ALIASES='alias imgcat=~/.iterm2/imgcat; alias it2dl=~/.iterm2/it2dl'fiif [ "${SHELL}" = fish ]thenecho "Make sure you have fish 2.2 or later. Your version is:"fish -vURL="https://iterm2.com/misc/fish_startup.in"mkdir -p "${HOME}/.config/fish"SCRIPT="${HOME}/.config/fish/config.fish"HOME_PREFIX='{$HOME}'SHELL_AND='; and'ALIASES='alias imgcat=~/.iterm2/imgcat; alias it2dl=~/.iterm2/it2dl; alias imgls=~/.iterm2/imgls'fiif [ "${URL}" = "" ]thendie "Your shell, ${SHELL}, is not supported yet. Only tcsh, zsh, bash, and fish are supported. Sorry!"exit 1fiFILENAME="${HOME}/.iterm2_shell_integration.${SHELL}"RELATIVE_FILENAME="${HOME_PREFIX}/.iterm2_shell_integration.${SHELL}"echo "Downloading script from ${URL} and saving it to ${FILENAME}..."# curl -SsL "${URL}" > "${FILENAME}" || die "Couldn't download script from ${URL}"chmod +x "${FILENAME}"echo "Checking if ${SCRIPT} contains iterm2_shell_integration..."if ! grep iterm2_shell_integration "${SCRIPT}" > /dev/null 2>&1; thenecho "Appending source command to ${SCRIPT}..."cat <<-EOF >> "${SCRIPT}"test -e ${QUOTE}${RELATIVE_FILENAME}${QUOTE} ${SHELL_AND} source ${QUOTE}${RELATIVE_FILENAME}${QUOTE}EOFfitest -d ~/.iterm2 || mkdir ~/.iterm2echo "Downloading imgcat..."# curl -SsL "https://iterm2.com/imgcat" > ~/.iterm2/imgcatchmod +x ~/.iterm2/imgcatecho "Downloading it2dl..."# curl -SsL "https://iterm2.com/it2dl" > ~/.iterm2/it2dlchmod +x ~/.iterm2/it2dlecho "Downloading imgls..."# curl -SsL "https://iterm2.com/imgls" > ~/.iterm2/imglschmod +x ~/.iterm2/imglsecho "Adding aliases..."echo "$ALIASES" >> "${FILENAME}"echo "Done."echo "--------------------------------------------------------------------------------"echo ""echo "The next time you log in, shell integration will be enabled."echo ""echo "You will also have these commands:"echo "imgcat filename"echo " Displays the image inline."echo "it2dl filename"echo " Downloads the specified file, saving it in your Downloads folder."
2. 新建文件 ~/.iterm2/imgcat
#!/bin/bash# tmux requires unrecognized OSC sequences to be wrapped with DCS tmux;# <sequence> ST, and for all ESCs in <sequence> to be replaced with ESC ESC. It# only accepts ESC backslash for ST.function print_osc() {if [[ $TERM == screen* ]] ; thenprintf "\033Ptmux;\033\033]"elseprintf "\033]"fi}# More of the tmux workaround described above.function print_st() {if [[ $TERM == screen* ]] ; thenprintf "\a\033\\"elseprintf "\a"fi}# print_image filename inline base64contents print_filename# filename: Filename to convey to client# inline: 0 or 1# base64contents: Base64-encoded contents# print_filename: If non-empty, print the filename# before outputting the imagefunction print_image() {print_oscprintf '1337;File='if [[ -n "$1" ]]; thenprintf 'name='`printf "%s" "$1" | base64`";"fiVERSION=$(base64 --version 2>&1)if [[ "$VERSION" =~ fourmilab ]]; thenBASE64ARG=-delif [[ "$VERSION" =~ GNU ]]; thenBASE64ARG=-dielseBASE64ARG=-Dfiprintf "%s" "$3" | base64 $BASE64ARG | wc -c | awk '{printf "size=%d",$1}'printf ";inline=$2"printf ":"printf "%s" "$3"print_stprintf '\n'if [[ -n "$4" ]]; thenecho $1fi}function error() {echo "ERROR: $*" 1>&2}function show_help() {echo "Usage: imgcat [-p] filename ..." 1>& 2echo " or: cat filename | imgcat" 1>& 2}## Mainif [ -t 0 ]; thenhas_stdin=felsehas_stdin=tfi# Show help if no arguments and no stdin.if [ $has_stdin = f -a $# -eq 0 ]; thenshow_helpexitfi# Look for command line flags.while [ $# -gt 0 ]; docase "$1" in-h|--h|--help)show_helpexit;;-p|--p|--print)print_filename=1;;-*)error "Unknown option flag: $1"show_helpexit 1;;*)if [ -r "$1" ] ; thenhas_stdin=fprint_image "$1" 1 "$(base64 < "$1")" "$print_filename"elseerror "imgcat: $1: No such file or directory"exit 2fi;;esacshiftdone# Read and print stdinif [ $has_stdin = t ]; thenprint_image "" 1 "$(cat | base64)" ""fiexit 0
3. 新建文件~/.iterm2/it2dl
#!/bin/bashif [ $# -lt 1 ]; thenecho "Usage: $(basename $0) file ..."exit 1fifor fn in "$@"doif [ -r "$fn" ] ; then[ -d "$fn" ] && { echo "$fn is a directory"; continue; }printf '\033]1337;File=name='`echo -n "$fn" | base64`";"wc -c "$fn" | awk '{printf "size=%d",$1}'printf ":"base64 < "$fn"printf '\a'elseecho File $fn does not exist or is not readable.fidone
4. 新建 ~/.iterm2/imgls
#!/bin/bash# tmux requires unrecognized OSC sequences to be wrapped with DCS tmux;# <sequence> ST, and for all ESCs in <sequence> to be replaced with ESC ESC. It# only accepts ESC backslash for ST.function print_osc() {if [ x"$TERM" = "xscreen" ] ; thenprintf "\033Ptmux;\033\033]"elseprintf "\033]"fi}function check_dependency() {if ! (builtin command -V "$1" > /dev/null 2>& 1); thenecho "imgcat: missing dependency: can't find $1" 1>& 2exit 1fi}# More of the tmux workaround described above.function print_st() {if [ x"$TERM" = "xscreen" ] ; thenprintf "\a\033\\"elseprintf "\a"fi}function list_file() {fn=$1dims=$(php -r 'if (!is_file($argv[1])) exit(1); $a = getimagesize($argv[1]); if ($a==FALSE) exit(1); else { echo $a[0] . "x" .$a[1]; exit(0); }' "$fn")rc=$?if [[ $rc == 0 ]] ; thenprint_oscprintf '1337;File=name='`echo -n "$fn" | base64`";"wc -c "$fn" | awk '{printf "size=%d",$1}'printf ";inline=1;height=3;width=3;preserveAspectRatio=true"printf ":"base64 < "$fn"print_stif [ x"$TERM" == "xscreen" ] ; then# This works in plain-old tmux but does the wrong thing in iTerm2's tmux# integration mode. tmux doesn't know that the cursor moves when the# image code is sent, while iTerm2 does. I had to pick one, since# integration mode is undetectable, so I picked the failure mode that at# least produces useful output (there is just too much whitespace in# integration mode). This could be fixed by not moving the cursor while# in integration mode. A better fix would be for tmux to interpret the# image sequence, though.## tl;dr: If you use tmux in integration mode, replace this with the printf# from the else clause.printf '\033[4C\033[Bx'elseprintf '\033[A'fiecho -n "$dims "ls -ld "$fn"elsels -ld "$fn"fi}check_dependency phpcheck_dependency base64check_dependency wcif [ $# -eq 0 ]; thenfor fn in *dolist_file "$fn"done < <(ls -ls)elsefor fn in "$@"dolist_file "$fn"donefi
5. 执行 install_shell_integration_and_utilities.sh
bash install_shell_integration_and_utilities.sh
6. 退出 session ,并重新登陆
执行命令:
imgcat ****.jpg
效果示例: 
附:
use rz in iterm2
https://molunerfinn.com/iTerm2-lrzsz/
这篇关于在服务器上浏览图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!