⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osql

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻
字号:
#! /bin/sh# $Id: osql,v 1.6 2007/02/06 02:51:18 jklowden Exp $## Check odbc.ini, odbcinst, and, optionally, freetds.conf, # then execute isql (assume it's unixODBC's isql).  #USAGE="Syntax: $(basename $0) -S server -U user -P password"while getopts I:S:U:P: OPTIONdo	case ${OPTION} in		I)	OVER_DIR=${OPTARG}	# override			;;		S)	DSN=${OPTARG}			;;		U)	USERNAME=${OPTARG}			;;		P)	PASSWORD=${OPTARG}			;;		\?)     echo $USAGE			exit 1			;;	esacdone#cho ${DSN} ${USERNAME} ${PASSWORD}if [ -z "${DSN}" -o -z "${USERNAME}" -o -z "${PASSWORD}" ]then 		echo $USAGE	exit 1fiISQL=$(command -v isql)if [ -z "${ISQL}" ]then	echo "$(basename $0): error: no \"isql\" command found.  Is unixODBC installed?"	exit 1fi# Establish ODBC prefix directoryODBC_DIR=$(strings ${ISQL} | grep ^/ | grep -v elf | grep -v '\.so\.' | head -1 | sed 's/lib$/etc/' )# N.B.  better than head(1) would be a loop to test the strings.  Since we're looking for a directory, # something like this might work:# for D in $(strings ${ISQL} | grep ^/ | grep -v elf | sed 's/lib$/etc/' )# do# 	if [ -d $D ]# 	then# 		ODBC_DIR = $D# 	fi# doneif [ -z "${ODBC_DIR}" ]then	echo "$(basename $0): error: no potential directory strings in \"$(command -v isql)\""	echo "isql strings are:"	strings ${ISQL} | grep ^/ | sed 's/^/+ /'	exit 1fiif [ "${OVER_DIR}" ]then	if [ -d "${ODBC_DIR}" ]	then		echo "\"${ODBC_DIR}\" (from isql) is a directory, "		echo "	but is overridden by \"${OVER_DIR}\"."	else 		echo "${ODBC_DIR} (from isql) is not a directory"		echo "	and is overridden by \"${OVER_DIR}\"."	fi		if [ -d "${OVER_DIR}" ]	then		ODBC_DIR=${OVER_DIR}	else		echo "$(basename $0): error: \"${OVER_DIR}\" is not a directory (disallowing)"	fifiif [ ! -d "${ODBC_DIR}" ]then	echo "$(basename $0): error: ${ODBC_DIR} (from isql) is not a directory!"	echo "isql strings are:"	strings ${ISQL} | grep ^/ | grep -v elf | grep -v '\.so\.' | sed 's/^/+ /'	return 1fiecho "looking for odbc.ini and odbcinst.ini in ${ODBC_DIR}"# Look for server entry in odbc.ini for F in "${HOME}/.odbc.ini" "${ODBC_DIR}/odbc.ini"do	if [ -r "$F" ]	then		echo '	'reading \"$F\"	else		echo '	'cannot read \"$F\"		continue	fi	grep "[${DSN}]" $F > /dev/null	if [ $? -eq 0 ]	then		echo "[${DSN}]" found in \"$F\"		ODBC_INI=$F		break	else		echo "[${DSN}]" not found in \"$F\"	fidoneif [ -z "${ODBC_INI}" ]then	echo "$(basename $0): error: unable to locate ${DSN} in any odbc.ini"	exit 1fi# Report finding of server entryecho found this section:SED_CMD="/^\[${DSN}\]/,/^[[:space:]]*$/ { s/^/	/; p; }"sed -ne "${SED_CMD}" ${ODBC_INI}## Examine server entry in odbc.ini ## Find the driver in the servername or default sectionfor D in "${DSN}" 'default' do	echo "looking for driver for DSN [$D]"	grep "$D" ${ODBC_INI} > /dev/null	if [ $? -eq 0 ]	then		CMD="/^\[$D\]/,/^[[:space:]]*$/ { s/^/	/; p; }"		DRIVER_LINE=$(sed -ne "${CMD}" ${ODBC_INI} \				| grep -Ei '^[[:space:]]*driver[[:space:]]*=')		if [ -z "${DRIVER_LINE}" ]		then			echo "no driver mentioned for [$D] in $(basename ${ODBC_INI})"			continue		fi		DRIVER=$(echo ${DRIVER_LINE} | awk '{print $3}')		if [ "${DRIVER}" ]		then			echo "driver \"${DRIVER}\" found for [$D] in $(basename ${ODBC_INI})"			break		else			echo "driver line incomplete for [$D] in $(basename ${ODBC_INI})"			continue		fi	fidoneif [ -z "${DRIVER}" ]then	echo "$(basename $0): error: no driver found for [${DSN}] in $(basename ${ODBC_INI})"	exit 1fi# get filename of driverecho found driver named \"${DRIVER}\"if [ ! -r "${DRIVER}" ]then	# not a filename, look it up	DRIVERNAME=${DRIVER}	ODBC_INST="${ODBC_DIR}/odbcinst.ini"	echo "${DRIVERNAME} is not a readable file"	echo "looking for entry named [${DRIVERNAME}] in ${ODBC_INST}"	grep "${DRIVERNAME}" ${ODBC_INST} > /dev/null	if [ $? -ne 0 ]	then		if [ $? -eq 1 ]		then			echo "$(basename $0): error: no driver entry [${DRIVERNAME}] in ${ODBC_INST}"		fi		exit 1;	fi		CMD="/^\[${DRIVERNAME}\]/,/^[[:space:]]*$/ { s/^/	/; p; }"	DRIVER_LINE=$(sed -ne "${CMD}" ${ODBC_INST} \				| grep -Ei '^[[:space:]]*driver[[:space:]]*=')	if [ -z "${DRIVER_LINE}" ]	then		echo "no driver mentioned for [${DRIVERNAME}] in $(basename ${ODBC_INST})"		exit 1	fi	DRIVER=$(echo ${DRIVER_LINE} | awk '{print $3}')	if [ -z "${DRIVER}" ]	then		echo "driver line incomplete for [${DRIVERNAME}] in $(basename ${ODBC_INST})"		exit 1	fi	echo "driver \"${DRIVER}\" found for [${DRIVERNAME}] in $(basename ${ODBC_INST})"fiif [ -z "${DRIVER}" ]then	echo 'error: sorry, failed sanity check: ${DRIVER} is null' 	exit 1fiif [ -r "${DRIVER}" ]then	echo "${DRIVER} is a readable file"else	echo "${DRIVER} is not a readable file"	echo "$(basename $0): error: no driver found for ${DSN}"	exit 1fi# find the server/servernameSERVER_LINE=$(sed -ne "${SED_CMD}" ${ODBC_INI} \		| grep -Ei '^[[:space:]]*server(name)*[[:space:]]*=')ATTRIBUTE=$(echo ${SERVER_LINE} | awk '{print $1}')if [ -z "${ATTRIBUTE}" ]then	echo "$(basename $0): neither \"Server\" nor \"Servername\" found for [${DSN}] in $(basename ${ODBC_INI})"	exit 1fiecho ${SERVER_LINE} | grep -i servername >/dev/null## Find the server's hostname #if [ $? -eq 0 ] # ODBC-Combinedthen	TDS_SERVER=$(echo ${SERVER_LINE} | awk '{print $3}')	echo 'Using ODBC-Combined strategy'	echo "FreeTDS servername is \"${TDS_SERVER}\" (from ${ODBC_INI})"	if [ -z "${TDS_SERVER}" ]	then		exit 1	fi	# Look for $TDS_SERVER in freetds.conf 		FREETDS_DIR=$(tsql -C | grep 'freetds.conf directory' | awk -F: '{print $2}' | sed 's/^ *//')	if [ -z "${FREETDS_DIR}" ]	then		echo "$(basename $0): error: unable to locate directory for freetds.conf using \"$(command -v tsql)\""		exit 1	fi		for F in "${HOME}/.freetds.conf" "${FREETDS_DIR}/freetds.conf"	do		echo "looking for [${TDS_SERVER}] in $F"		if [ -r "$F" ]		then			echo "\"$F\" is a readable file"		else			echo cannot read \"$F\"			continue		fi		grep "[${TDS_SERVER}]" $F > /dev/null		if [ $? -eq 0 ]		then			FREETDS_CONF=$F			break		else			echo "[${TDS_SERVER}]" not found in \"$F\"		fi	done		if [ -z "${FREETDS_CONF}" ]	then		echo "$(basename $0): error: unable to locate ${TDS_SERVER} in any freetds.conf"		exit 1	fi	# Examine server entry in freetds.conf 	echo found this section:	SED_CMD="/^\[${TDS_SERVER}\]/,/^[[:space:]]*$/ { s/^/	/; p; }"	sed -ne "${SED_CMD}" ${FREETDS_CONF}	SERVER_LINE=$(sed -ne "${SED_CMD}" ${FREETDS_CONF} \			| grep -Ei '^[[:space:]]*host[[:space:]]*=')	HOST=$(echo ${SERVER_LINE} | awk '{print $3}')	if [ -z "${HOST}" ]	then		echo "$(basename $0): no \"host\" entry found for [${TDS_SERVER}] in $(basename ${FREETDS_CONF})"		exit 1	fi	else # odbc.ini contains a "server", a DNS host	HOST=$(echo ${SERVER_LINE} | awk '{print $3}')	echo "\"${ATTRIBUTE}\" found, not using freetds.conf"	echo "FreeTDS servername is \"${HOST}\""	if [ -z "${HOST}" ]	then		echo "$(basename $0): no value found for \"${ATTRIBUTE}\" entry in $(basename ${ODBC_INI})"		exit 1	fifi# Now we have a DNS hostname for the server in HOSTCMD="host ${HOST}"OUTPUT=$(${CMD})ADDRESS=$(echo ${OUTPUT} | sed 's/..*has address //')if [ -z "${ADDRESS}" ]then	echo "$(basename $0): no IP address found for \"${HOST}\""	exit 1fiecho ${HOST} has address ${ADDRESS}# Report what we know and exec isql printf "\n";printf "%30s:\t%-30s\n" DSN ${DSN}printf "%30s:\t%-30s\n" "Server's hostname" ${HOST}printf "%30s:\t%-30s\n" Address ${ADDRESS}printf "%30s:\t%-30s\n" Driver ${DRIVER}printf "\n";echo Attempting connection as ${USERNAME}... exec isql ${DSN} ${USERNAME} ${PASSWORD} -v

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -