Because I have a putty terminal running on my PC most every day (mostly sitting there doing nothing, waiting for a command,) I thought I’d put that open terminal to use and have it display stock tickers. So I asked ChatGPT to create a bash shell script that display a ticker and it’s price from the internet. I am not a good programmer/developer, and I can barely write a few scripts, but by using ChatGPT I was able to produce what I wanted in a short amount of time. Below is the script that it produced:
#!/usr/bin/env bash
set -e
LANG=C
LC_NUMERIC=C
SYMBOLS=("$@")
if ! $(type jq > /dev/null 2>&1); then
echo "'jq' is not in the PATH. (See: https://stedolan.github.io/jq/)"
exit 1
fi
if [ -z "$SYMBOLS" ]; then
echo "Usage: ./ticker.sh AAPL MSFT GOOG BTC-USD"
exit
fi
FIELDS=(symbol marketState regularMarketPrice regularMarketChange regularMarketChangePercent \
preMarketPrice preMarketChange preMarketChangePercent postMarketPrice postMarketChange postMarketChangePercent)
API_ENDPOINT="https://query1.finance.yahoo.com/v6/finance/quote?lang=en-US®ion=US&corsDomain=finance.yahoo.com"
if [ -z "$NO_COLOR" ]; then
: "${COLOR_BOLD:=\e[1;37m}"
: "${COLOR_GREEN:=\e[32m}"
: "${COLOR_RED:=\e[31m}"
: "${COLOR_RESET:=\e[00m}"
fi
symbols=$(IFS=,; echo "${SYMBOLS[*]}")
fields=$(IFS=,; echo "${FIELDS[*]}")
results=$(curl --silent "$API_ENDPOINT&fields=$fields&symbols=$symbols" \
| jq '.quoteResponse .result')
query () {
echo $results | jq -r ".[] | select(.symbol == \"$1\") | .$2"
}
for symbol in $(IFS=' '; echo "${SYMBOLS[*]}" | tr '[:lower:]' '[:upper:]'); do
marketState="$(query $symbol 'marketState')"
if [ -z $marketState ]; then
printf 'No results for symbol "%s"\n' $symbol
continue
fi
preMarketChange="$(query $symbol 'preMarketChange')"
postMarketChange="$(query $symbol 'postMarketChange')"
if [ $marketState == "PRE" ] \
&& [ $preMarketChange != "0" ] \
&& [ $preMarketChange != "null" ]; then
nonRegularMarketSign='*'
price=$(query $symbol 'preMarketPrice')
diff=$preMarketChange
percent=$(query $symbol 'preMarketChangePercent')
elif [ $marketState != "REGULAR" ] \
&& [ $postMarketChange != "0" ] \
&& [ $postMarketChange != "null" ]; then
nonRegularMarketSign='*'
price=$(query $symbol 'postMarketPrice')
diff=$postMarketChange
percent=$(query $symbol 'postMarketChangePercent')
else
nonRegularMarketSign=''
price=$(query $symbol 'regularMarketPrice')
diff=$(query $symbol 'regularMarketChange')
percent=$(query $symbol 'regularMarketChangePercent')
fi
if [ "$diff" == "0" ] || [ "$diff" == "0.0" ]; then
color=
elif ( echo "$diff" | grep -q ^- ); then
color=$COLOR_RED
else
color=$COLOR_GREEN
fi
if [ "$price" != "null" ]; then
printf "%-10s$COLOR_BOLD%8.2f$COLOR_RESET" $symbol $price
printf "$color%10.2f%12s$COLOR_RESET" $diff $(printf "(%.2f%%)" $percent)
printf " %s\n" "$nonRegularMarketSign"
fi
done
This produced the following, for example:
This works well, however I want the script to display a number of different tickers and have the data refresh every 10 seconds. The next script produced is the following ticker_loop.sh. I added my tickers
#!/bin/bash
while true; do
clear
./ticker.sh PLTR SOFI HIMS ARKK AHT QYLD MSFT ONON
sleep 10
done
This is what I was looking for! So I simply had to modify both to run as executible / binary files. To do so, use the command:
chmod +x ticker_loop.sh
Lastly, run the script with the command ./ticker_loop.sh
How do I get all of the DNS records for a domain using the dig command in only “Answer Section” (+answer) format? The command should return A, MX, NS, TXT, SOA and CNAME records.
Normally using the “any” flag, we would get all of this information at once, however, when attempting to run a dig command with the ‘any’ switch, we do not get the DNS records we want:
dig jasoncoltrin.com any
The above command returns an answer section with only: “RFC8428” “”
According to chatgpt, this means that the ‘any’ query type is not guaranteed to return all the records for a given name, and some DNS servers may choose to return an empty answer instead. This is done to improve the performance and security of the DNS system.
Still, I want to have a single command to get the most information at once, and the following command does so, however, writing the command is impractical:
dig +noall +answer +multi jasoncoltrin.com A jasoncoltrin.com MX jasoncoltrin.com NS jasoncoltrin.com TXT jasoncoltrin.com SOA jasoncoltrin.com CNAME
I also tried the following with no luck:
dig +noall +answer jasoncoltrin.com A,MX,NS,TXT
This only returned the A records.
So instead, we can use a bash script to create a $domain variable, and have the script use the ‘read’ command to prompt us for the domain name:
#!/bin/bash
read -p "Enter the domain name: " domain
dig +noall +answer +multi $domain A $domain MX $domain NS $domain TXT $domain SOA $domain CNAME
To write the script, do the following:
vi digdomain.sh
(insert) > copy/paste script > (Escape) > :wq
Then make the script executable with the command:
chmod +x digdomain.sh
Run the command using the ./ prefix:
./digdomain.sh
When we run the script, we’re prompted for the domain name, then the result is most of the information we want in an easy-to-read format:
jason@ubuntu0:~$ ./digdomain.sh
Enter the domain name: jasoncoltrin.com
jasoncoltrin.com. 118 IN A 172.67.196.181
jasoncoltrin.com. 118 IN A 104.21.44.69
jasoncoltrin.com. 1854 IN MX 10 mailstore1.secureserver.net.
jasoncoltrin.com. 1854 IN MX 0 smtp.secureserver.net.
jasoncoltrin.com. 5652 IN NS daisy.ns.cloudflare.com.
jasoncoltrin.com. 5652 IN NS lee.ns.cloudflare.com.
jasoncoltrin.com. 300 IN TXT "Currently located in a black hole\" \"Likely to be eaten by a grue"
jasoncoltrin.com. 300 IN TXT "google-site-verification=key"
jasoncoltrin.com. 300 IN TXT "google-site-verification=key"
jasoncoltrin.com. 2052 IN SOA daisy.ns.cloudflare.com. dns.cloudflare.com. (
2305113011 ; serial
10000 ; refresh (2 hours 46 minutes 40 seconds)
2400 ; retry (40 minutes)
604800 ; expire (1 week)
3600 ; minimum (1 hour)
)
This made me happy because I had forgotten about my easter egg TXT record. 🙂
Use PowerShell to get the Windows Experience Index in Windows 10
Windows 7 has the Windows Experience Index which is used often by hardware techs to get a good idea about the kind of hardware installed in a PC. It also allows you to quickly find where improvements can be made to get the machine to run faster. The following screenshot is an example of the Windows 7 Windows Experience Index:
You can get an idea about how fast the components of your Windows 10 computer are by running the Windows System Assessment Tool, but the readout is a little hard to understand. Skip this part (winsat formal) to get the Windows Experience Index in Windows 10 or Windows 7 with PowerShell below.
First open an elevated command prompt and run the command:
winsat formal
Below is a screenshot of the command running and it’s output. Running this tool will slow down your PC for a few minutes as it runs the tests:
Results:
The Windows Experience Index WMI modules are still available in Windows 10, however, the scores are not readily apparent in the Windows 10 system settings.
To get your Windows 10 Windows Experience Index subscores with PowerShell, first open up the Windows PowerShell ISE. Next, go to the following link: https://pastebin.com/i5M81xsV, -credit goes to reddit user:
Copy the code into the Windows 10 PowerShell ISE and then run the script, or create a .ps1 file, and you can get the Windows Experience Index with PowerShell in either Windows 10 or Windows 7:
So you can see that in my results, my WEI score would be 7.5 – where the lowest subscore determines my overall result. Looking at the scores, I can improve my score and upgrade my computer by increasing the DSK (disk) performance. To do this I would probably have to upgrade my motherboard to one that supports an NVME hard drive.
My friend’s laptop’s lowest score is VID (video) which means his laptop GPU is keeping the score low. There are a few options for upgrading a laptop GPU, such as an external GPU, but this isn’t surprising as most laptops GPUs can’t compete with a full-sized computer and GPU.
If your email servers support, or are required to enforce transport layer security (TLS), then you can use Symantec TLS Business Partners to configure policies to enforce encryption between your mail servers and the broader public, as well as Symantec’s Email Security Services infrastructure. You can also configure policies to enforce TLS encryption between your domains and the domains of third-party business partner organizations. This article will provide a procedure that demonstrates how to generate a report with Symantec PBE Advanced Domains that displays mail which failed a TLS policy. We then go on to process that report and relax the enforcement of Certificate Validation with the following steps:
Scrub the Symantec Report for just email addresses of the intercepted mail.
Remove the first part of the email addresses, leaving only a list of the domain names.
Compare the domains from Step 2 to already-existing TLS Business Partners and leave only those domains that are unique.
Create a new text .txt file with the unique domains, add ‘test@’ to the beginning of each domain to create an email address that can be tested at checktls.com.
Batch test the domains for certain TLS conditions.
Scrub and sort the checktls.com report for only those domains that meet conditions in Step 5.
Upload the list of unique, tested, and scrubbed domains into the Symantec Cloud TLS Business Partners.
Use Symantec to again test the domain for Certificate Validation, enable the domain, and enforce the encryption of traffic to that domain.
Often times, TLS encryption requirements will force end-users and recipients of TLS encrypted email to log into a secure mail portal to authenticate and retrieve messages. Depending on your organization’s policies, you may want to ‘relax’ the level of enforcement of TLS requirements so that users can receive mail in ‘plain text’ as a normal message in the user’s mailbox. These different levels of encryption are scored by traits including the availability of TLS encryption, TLS negotiation, the SSL/TLS Certificate trustworthiness, and other factors.
To a large degree, TLS email encryption has not quite become the standard for many mail servers out there. Many large mail providers such as earthlink.net do not support TLS encrypted email. Some mail servers will allow TLS encyrption (TLSAvailable=100), negotiate a TLS transaction (NegotiatedTLS=100), but not have a valid certificate (CertOK >= 33). Often times, the CertOK value will not reach 100 simply because the certificate on the receiving server is a self-signed certificate.
You can check the support of an email address or domain by visiting checktls.com, enter an email address into the address test, and hit the ‘Try It’ button. For example, when we test [email protected], our results are as follows:
In this case, if Symantec /MessageLabs were to try to send a message to the recipient, the message would not be delivered to the recipient mailbox, but quarantined in a secure mail portal. The recipient would then be required to create a secure portal account, log in, and retrieve the message.
If our results above were to demonstrate the passing of all checks with the exception of the CertOK column, then we may want to relax the enforcement of certificate validation in Symantec. But in order to find all of the domains that meet these conditions, (excluding those domains we already have validated and trust), we need to generate reports, scrub the data, and test for the conditions we accept. Once we find the unique domains, we’ll add them into our list of TLS Business Partners.
While the following procedure does not have long-winded explanations and exact step-by-step instructions, the information and screenshots should be enough to get you through the process, hopefully saving you the hours of research and note-taking that I endured. This article does not go over the initial setup of your domain’s email encryption with Symantec. The prerequisites for this guide are that you already have TLS email encyption setup with Symantec Cloud / MessageLabs.com. Also be sure to have Excel 2013 or newer and NotePad++ installed on your computer. Lastly, you may be required to purchase an account with checktls.com to run batch tests.
Lets get started!
We’ll first run a report in the Symantec Cloud / clients.messagelabs.com to find emails intercepted by the service. Starting in the Dashboard, go to Reports > Report Request > Request a new Report > Request name: PBEAdvancedDomains-Date > continue > email summary report (PDF) >
The data we will include in the report are:
Email Summary Report (PDF) advanced settings
Emails intercepted by the service
Data Protection volume
Data Protection volume by domain
Top 20 Data Protection recipients
Email Detailed Report (CSV) advanced settings
Data Protection
Download the Report.zip
Extract to Desktop\TLSReports\RepDomainsDate
Open the EmailDataProtectionDetail.csv
Copy the column “Email To” to a new spreadsheet named 1stRunRemoveNameAndAtSymbol.xlsx
In 1stRunRemoveNameAndAtSymbol.xlsx, delete the 1st row “Email To”
Excel wants you to type out the formula (instead of copy/paste) in the first cell B1, then apply formula down the column.
Apply formula to an entire column or row without dragging by Fill feature
In Excel, Select the entire Column B, and then click Home > Fill > Down.
Copy and Paste (Paste – Special->ValuesOnly) the resulting Domains (only) to a new sheet and name
1stRunDomainsOnlyDate.xlsx
Now you should have 3 files:
In Symantec Message Labs go to Services > Encryption > existing TLS Business Partners
Download All -> get TLSBusinessPartners.csv > rename to TLSBusinessPartnersDate.csv copy to same folder, so you should have 4 files. In the 1stRunRepDomainsOnlyDate.xlsx you may want to remove all the empty cells with #VALUE! From the bottom of the file.
Create a new folder named Compare, and copy 1stRunRepDomainsOnlyDate.xlsx and TLSBusinessPartnersDate.csv into the folder:
Remove all domains in TLSBusinessPartners file that are current Partners (as well as those existing in previously completed procedure runs.) – To do so,
Open 1stRunRepDomainsOnlyDate.xlsx. Create a new Sheet 2.
Open TLSBusinessPartners.. file and copy the column with only the domain names Column labeled “Business Partner Domain” into Sheet 2
Run compare and remove all domains that exist in TLS.BP.Date from 1stRunRDODate.
Scrub the domains of duplicates. Copy all the Business Partner Domains AND be sure to include all of the domains listed in TLS Enforcement page into Test sheet (selecting with the mouse, copy from website, and paste into excel works, just remove the hyperlinks).
Next, select Sheet 1 then go to the Data tab and click Remove Duplicates:
Click OK
Add a new row to A1 top level and add header named: “CleanThese” for Column A and “Business Partner Domains” for Column B
Copy existing Business Partner unique domains in Test sheet to B1
Should now look something like this:
Now Filter for Unique values:
Click on the Column Header to highlight Column A. Select the Conditional Formatting button on the Home tab.
Select the New Rule option from the Conditional Formatting button drop-down list. Select “Use a formula to determine which cells to format" as a rule in the New Formatting Rule window.
Proceed by entering the following formula in the “Format values where this formula is true" box: =countif($B:$B, $A1)
Click on the Format button and specify the format you want to set. It is possible to set a different cell color for duplicate values by clicking the Fill tab and selecting a background color. (Orange)
After having specified the format you want click OK.
CheckTLS batch test: Once you’ve uploaded the file, hit R(u)n Test Now to initiate the testing. One domain takes 5 minutes, so 4000 domains can take 4 hours or so. An estimate from checktls.com will be given.
Once the report arrives via email, copy the data in email to a new file named TLSCheckReportResults1-9-17.xlsx
Next, find CertOK is a value of 33 or 0, but the TLSAvailable=100 and NegotiatedTLS=100
To do this, do Ctrl+A then Sort & Filter > Custom Sort > Sort by CertOK > Sort on Values > Order Custom List: 33, 0 > OK > OK
(Column H is Cert OK) so Select only those that are anything other than 100, copy the rows to a new spreadsheet named
TLSCheckReportResultsCertOK33-Date.xlsx
Sort the TLSCheckReportResultsCertOK33 file by TLSAvailable=100 and NegotiatedTLS=100
To do this, first remove all columns except EMailAddress, TLSAvailable, CertOK, and NegotiatedTLS=100
Do another custom sort; select columns labeled TLSAvailable, Cert OK, and NegotiatedTLS, and Sort by Column B (TLS) then by Column D (SenderOK/Sec) Largest to Smallest:
Select only those rows that have at least TLSAvailable = 100 … CertOK(%) … NegotiatedTLS = 100; where CertOK % is less than 100:
Copy these values to a new .xlsx file and folder named:
TLSCheckSortTLSAvailable100Negotiated100-Date
Copy custom sort results above into a new .xlsx file and rename the filename the same as the folder name.
Remove everything except the domain name (remove ‘test@’) from this file. Follow instructions above – delete columns B, C, D, then formula =RIGHT(A1,LEN(A1)-FIND(“@”,A1)) – then fill down (select column first)
Copy resulting domains to a new .txt file named:
TLSCheckSortTLS-DomainOnly-Final-Date.txt
Now we need to add the tested domains to the Business Partner for the week. Eg. RepDomains-Date in Symantec.
Log into Symantec Cloud,
Services > Encryption > TLS Business Partners > Add new BP > RepDomains-Date > Upload New Business Partner Domains > Uncheck “Enabled” > choose file > select TLSCheckSortTLS-DomainOnly-Final-Date.txt > Save
Now that all of the new unique domains have been imported, we need to test them within Symantec and change Certificate Validation from Strong to Relaxed if required.
Click on the domain name, hit the TLS Test button, and if the TLS connectivity fails, hit Close, change the Certificate Validation to “Relaxed” and then Save.
Go through each of the newly uploaded domains, and when finished, make sure to ENABLE TLS Encryption enforcement in the TLS Enforcements tab.
Take those in the list that test correctly and are enforced and add to Data Protection Exceptions. Services > Data Protection > PBE Advanced TLS the Portal Trigger Template > (scroll down) Recipient Exclude Domain List > Edit List > Add List Items > Add
It’s a good idea to repeat this procedure every so often so that you catch mail that is being delivered to the secure portal unnecessarily. Hopefully, this procedure will help someone save some time if they have the same task, or at the least help someone sort and scrub email addresses and domains.
“The term ‘Get-ADComputer’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.”
This error indicates that the Active Directory module has not been imported into PowerShell. First do this by running the command:
import-module activedirectory
This script should produce and export a .csv file list that looks like the following:
Name
OperatingSystem
OperatingSystemServicePack
OperatingSystemVersion
IPv4Address
DC01
Windows Server 2008 R2 Standard
Service Pack 1
6.1 (7601)
10.1.3.4
JasonCWKS
Windows 7 Professional
Service Pack 1
6.1 (7601)
10.1.2.129
JColtrinWin7
Windows 7 Professional
Service Pack 1
6.1 (7601)
10.1.2.85
If you want to take this further, and get the csname (computer name), caption (Operating system title), OS Architecture (32/64 bit), and ServicePackMajorVersion (service pack level) from a list of IP’s that the previous command produced you can do the following:
Copy the IP addresses of all the machines to a new file called win7pcs.txt and place it in C:\admin\
Open Powershell ISE and enter the following script:
If a computer is powered up on your network, but RDP is not enabled, you can create a group policy to enable RDP, and then restart the computer. Or instead, you can use psexec to remotely enable RDP.
Below are a couple one-line scripts to enable RDP on a remote computer from a different computer on the same domain. Keep in mind you need to be an administrator and you will only enable RDP for yourself, not an entire security group.
Download the pstools to your computer from the sysinternals download site here and unzip them into a folder named pstools at the root of your c: drive.
Open the command prompt as administrator.
Change directory into c:\pstools (where the pstools files are located) then run the command: